perm filename RUNOFF.MAC[S,DWP] blob
sn#172451 filedate 1975-08-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00067 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00006 00002 DEFINE VER(V),<
C00008 00003 CALLI DEFINITIONS
C00009 00004 DEFINE JA(ADDR) <
C00010 00005 MISCELLANEOUS DEFINITIONS
C00013 00006 STATE REGISTER #2 BITS
C00014 00007 LOC 137
C00016 00008 OPEN TTY,TTYIO OPEN UP TTY CHANNEL
C00019 00009 OPN1: OPEN IN,OPENI OPEN INPUT CHANNEL IF NOT TTY
C00022 00010 OPN4: MOVEM A3,OPNT+1
C00025 00011 S1: TRNN S,SEQNO ARE THERE SEQUENCE NUMBERS?
C00027 00012 S4: MOVEI CNT,0 LOOKUP COMMAND
C00030 00013 S10: JM FILLM,S11 JUMP IF IN FILL MODE
C00033 00014 S14: MOVEM T3,ALNGTH UPDATE ACCUMULATED LENGTH
C00035 00015 OUTLIN: TLZN S,HEADL IS LINE A HEADING LINE?
C00038 00016 OUTL4: JNM HEADM,OUTL6 JUMP IF NO HEADING TO OUTPUT
C00040 00017 OUTL12: PUSHJ P,OUTPG3 OUTPUT A CR LF
C00043 00018 OUTL20: TRZN S,CENTOL CENTER NEXT LINE OF OUTPUT?
C00046 00019 OUTL24: TLZE S,SPACEM SPACE SOME LINES?
C00048 00020 OUTPGN: MOVE T1,PAGENO GET PAGE NUMBER IN T1
C00050 00021 ACCUM: AOS T1,SYMCNT INCREMENT SYMBOL COUNT
C00053 00022 ACCUM5: TLNE S,ULINEM UNDERLINE SYMBOL?
C00056 00023 ACCU6A: TRC S,UCS COMPLEMENT UPPER CASE SHIFT BIT
C00059 00024 ACCU11: JNM FILLM,ACCU12 JUMP IF NOFILL MODE
C00062 00025 GET: <DEVICE>:<FILE>.<EXT>[<PROJECT>,<PROGRAMMER>]
C00064 00026 GET SIXBIT NAME
C00066 00027 OUTPUT ROUTINE
C00069 00028 COUT0C: MOVE C,CC C = CHARACTER TO BE OUTPUT
C00071 00029 COUT1A: PUSHJ P,COUT6 DO IT
C00073 00030 INPUT ROUTINE
C00076 00031 TYPE STRING ROUTINE
C00077 00032 TABLE OF DIRECT COMMANDS TO RUNOFF
C00079 00033 DONE<CRLF>
C00080 00034 SKIP <N><CRLF>
C00082 00035 LM <N><CRLF>
C00084 00036 SLOW <N><CRLF>
C00086 00037 TRANSLATION TABLE: ASCII TO IBM 2741 (JOSS)
C00088 00038 BALL1: JOSS BALL (#934)
C00093 00039 JOSS 167,<LC,C,B,8,2,1>
C00094 00040 BALL2: #137M
C00096 00041 BALL3: #938
C00098 00042 BALL4: #015
C00100 00043 DEFINE CMD(NAME,ABRV,MODE) <
C00103 00044 BREAK OFF PREVIOUS LINE
C00105 00045 SET LINE LENGTH
C00107 00046 DO NOT RIGHT JUSTIFY LINES
C00109 00047 SET SINGLE SPACING (I.E. RESET DOUBLE SPACING MODE)
C00111 00048 PROCESS FIGURE PAGE
C00113 00049 SET TABS
C00115 00050 TAB TO NEXT TAB SETTING OR TO SPECIFIED POSITION
C00117 00051 BEGIN PAGE COMMAND
C00118 00052 CHARACTER CLASS TABLE
C00120 00053 DEFINE BY(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11),<
C00122 00054 CLASS:
C00123 00055 ASCII 020-037
C00124 00056 ASCII 040-057
C00125 00057 ASCII 060-077
C00126 00058 ASCII 100-117
C00127 00059 ASCII 120-137
C00128 00060 ASCII 140-157
C00129 00061 ASCII 160-177
C00130 00062 SPECER: MOVEI PNT,[ASCIZ /Error in specification!/]
C00132 00063 LIT
C00133 00064 DATA AREA (IMPURE DATA AREA)
C00134 00065 RELOC LC-140
C00137 00066 FORMAT OF SYMBOL POINTER WORD IN SYMBOL POINTER TABLE:
C00138 00067
C00139 ENDMK
C⊗;
DEFINE VER(V),<
TITLE RUNOFF - DOCUMENTATION PROCESSOR -- VERSION #'V
RUNVER=<XWD V,0>>
VER(36)
SUBTTL A. K. OLSON
TWOSEG
MLON
; TTCALL DEFINITIONS
OPDEF OUTCHR[TTCALL 1,]
OPDEF OUTSTR[TTCALL 3,]
OPDEF INCHWL[TTCALL 4,]
OPDEF INCHSL[TTCALL 5,]
OPDEF GETLIN[TTCALL 6,]
OPDEF SETLIN[TTCALL 7,]
OPDEF CLRBFI[TTCALL 11,]
OPDEF CLRBFO[TTCALL 12,]
; REGISTER DEFINITIONS
S=0 ;SWITCH REGISTER
SS=1 ;SECOND SWITCH REGISTER
P=2 ;PUSH DOWN POINTER
C=3 ;CHARACTER REGISTER
CC=C+1 ;CHARACTER CLASS REGISTER
PNT=CC+1 ;POINTER WORD REGISTER
CNT=PNT+1 ;COUNTER REGISTER
SP=CNT+1 ;SYMBOL POINTER
T1=SP+1 ;TEMPORARY ACCUMULATOR #1
T2=T1+1 ;TEMPORARY ACCUMULATOR #2
T3=T2+1 ;TEMPORARY ACCUMULATOR #3
A1=T3+1
A2=A1+1
A3=A2+1
A4=A3+1
A5=A4+1
A6=A5+1
; FILE SPECIFICATION ASSUMPTIONS
AIEXT=<SIXBIT / RNO/> ;ASSUMED INPUT FILE EXTENSION
AOEXT=<SIXBIT / LST/> ;ASSUMED OUTPUT FILE EXTENSION
ADVND=<SIXBIT / TTY/> ;ASSUMED DEVICE IF NO FILE SPECIFIED
ADVFS=<SIXBIT / DSK/> ;ASSUMED DEVICE IF FILE SPECIFIED
; CALLI DEFINITIONS
RESET=0
DEVCHR=4
CORE=11
EXIT=12
SLEEP=31
; MACRO AND OPDEF DEFINITIONS
OPDEF GET[PUSHJ P,GETIT]
OPDEF GETC[PUSHJ P,CIN]
OPDEF OUTC[PUSHJ P,COUT]
OPDEF OUTLF[PUSHJ P,COUTLF]
OPDEF OUTSP[PUSHJ P,COUTSP]
DEFINE TYPE(A) <
XLIST
MOVE PNT,[POINT 7,A]
PUSHJ P,TYPEIT
LIST>
DEFINE JE(CHR,ADDR) <
XLIST
CAIN C,CHR
JRST ADDR
LIST>
DEFINE JNE(CHR,ADDR) <
XLIST
CAIE C,CHR
JRST ADDR
LIST>
DEFINE JN(ADDR) <
XLIST
TLNE CC,CN
JRST ADDR
LIST>
DEFINE JNN(ADDR) <
XLIST
TLNN CC,CN
JRST ADDR
LIST>
DEFINE JA(ADDR) <
XLIST
JUMPL CC,ADDR
LIST>
DEFINE JNA(ADDR) <
XLIST
JUMPGE CC,ADDR
LIST>
DEFINE JM(MODE,ADDR) <
XLIST
IFE MODE-400000,<
JUMPL S,ADDR
>
IFN MODE-400000,<
TLNE S,MODE
JRST ADDR>
LIST>
DEFINE JNM(MODE,ADDR) <
XLIST
IFE MODE-400000,<
JUMPGE S,ADDR
>
IFN MODE-400000,<
TLNN S,MODE
JRST ADDR>
LIST>
DEFINE B(V,L),<
V: BLOCK L>
; MISCELLANEOUS DEFINITIONS
PSL=100 ;PUSH-DOWN STACK LENGTH
IN=1 ;INPUT CHANNEL
OUT=2 ;OUTPUT CHANNEL
TTY=3 ;TTY I/O CHANNEL
; STATE REGISTER BITS
;
; LEFT HALF:
STOPM=1B18 ;STOP AFTER EACH PAGE IS PROCESSED
JUSTM=1B19 ;JUSTIFY RIGHT MARGIN
FILLM=1B20 ;FILL LINE
HEADM=1B21 ;PUT OUT PAGE HEADER
DSPCM=1B22 ;DOUBLE SPACE MODE (OFF MEANS SINGLE SPACE)
CAPSM=1B23 ;CAPITALIZE SENTENCES
LOWCM=1B24 ;CONVERT LETTERS TO LOWER CASE
BREAKM=1B25 ;BREAK MODE
PNTOP=1B26 ;NUMBER PAGES AT TOP
PNBOT=1B27 ;NUMBER PAGES AT BOTTOM
ULINEM=1B28 ;UNDERLINE ALL SYMBOLS ON NEXT TEXT LINE
UCM=1B29 ;MAKE ALL LETTERS ON NEXT TEXT LINE UPPER CASE
SOSM=1B30 ;START OF SENTENCE SWITCH
HEADL=1B31 ;NEXT LINE IS A HEADING LINE
CENTRL=1B32 ;CENTER THE NEXT LINE
NPAGEM=1B33 ;SKIP TO A NEW PAGE ON NEXT OUTLIN
SPACEM=1B34 ;SPACE THE AMOUNT IN SPCNT BEFORE NEXT LINE
DENTM=1B35 ;INDENTATION FROM LEFT MARGIN FOR NEXT LINE ONLY
; RIGHT HALF:
LPAGEM=1B18 ;THIS IS THE LAST PAGE
SEQNO=1B19 ;INPUT FILE HAS SEQUENCE NUMBERS
TTY33=1B20 ;OUTPUT IN TTY 33 MODE
TTY37=1B21 ;OUTPUT IN TTY 37 MODE
LP10=1B22 ;OUTPUT IN LP10A,B,C MODE
LP10E=1B23 ;OUTPUT IN LP10E MODE
PPM=1B24 ;ADD PAGE PREFIX TO ALL PAGE NUMBERS
PPL=1B25 ;NEXT TEXT LINE IS PAGE PREFIX
FIGM=1B26 ;PROCESSING A FIGURE
OFIGSW=1B27 ;OUTPUTING A FIGURE
FIGFF=1B28 ;FIGURE FUDGE FLIP-FLOP
CRSW=1B29 ;CARRIAGE RETURN FORCE SWITCH
SLWSW=1B30 ;SLOW TYPING SPEED SWITCH
T2741=1B31 ;TERMINAL IS AN IBM 2741
PSEOS=1B32 ;PREVIOUS SYMBOL WAS END OF SENTENCE
UCS=1B33 ;UPPER CASE SHIFT MODE
CENTOL=1B34 ;CENTER NEXT LINE WHEN OUTPUT
ULS=1B35 ;UNDERLINE SHIFT
; STATE REGISTER #2 BITS
;
; LEFT HALF:
UCSHF=1B18 ;SHIFT MODE FOR IBM 2741
DONTUL=1B19 ;DON'T UNDERLINE SWITCH
SSALSW=1B20 ;SPLIT SYMBOLS ACROSS LINES
PCSPSW=1B21 ;PREVIOUS CHARACTER WAS A SPACE
CARDIN=1B22 ;INPUT IS FROM CARDS
DLYSPC=1B23 ;DELAY SPACES
ODLYSP=1B24 ;OUTPUT DELAYED SPACES
; PAGE FORMAT DEFINITIONS
LL=↑D60 ;LINE LENGTH
TOPM=↑D9 ;TOP MARGIN
BOTM=↑D9 ;BOTTOM MARGIN
LFTM=↑D5 ;LEFT MARGIN = 1.5" FOR TTY 37 (1.25" FOR TTY 33)
PPRL=↑D66 ;PAPER LENGTH
MAXLL=↑D132 ;MAXIMUM LINE LENGTH
PHASE=3 ;LINE PRINTER PHASING CONSTANT
LOC 137
EXP RUNVER
RELOC 400000
EXTERNAL JOBSA,JOBFF,JOBREL
RUNOFF: TDZA S,S ;NOT CCL ENTRY, SKIP
MOVEI S,0 ;CCL ENTRY
SETZ SS,
MOVEI T1,ENDRUN ;FUDGE JOBSA
HRLM T1,JOBSA
CALLI RESET ;RESET I/O
MOVEI T1,ENDRUN-1 ;GET ENOUGH CORE
CALLI T1,CORE ;DO CORE UUO
CALLI 12 ;NO CORE, EXIT
MOVE T1,[XWD DATA,140]
BLT T1,DATAE ;INITIALIZE DATA AREA CONSTANTS
SETZM DATBEG ;CLEAR DATA AREA
MOVE T1,[XWD DATBEG,DATBEG+1]
BLT T1,ENDRUN-1
MOVEI T1,SYMTAB
HRLM T1,SYMPNT-1
SETOM FIGCNT ;INITIALIZE FIGURE COUNT
MOVEI T1,1
MOVEM T1,RANDOM ;INITIALIZE RANDOM NUMBER GENERATOR
MOVEM T1,PAGENO ;INITIALIZE PAGE NUMBER
SETZM SKPCNT ;CLEAR PAGE SKIP COUNTER
MOVEI T1,TOPM ;INITIALIZE PAGE DEFINITION PARAMETERS
MOVEM T1,TOPMRG
MOVEI T1,BOTM
MOVEM T1,BOTMRG
MOVEI T1,LFTM
MOVEM T1,LFTMRG
MOVEI T1,LL
MOVEM T1,LINEL
MOVEI T1,PPRL
MOVEM T1,PAPERL
SUBI T1,TOPM
MOVEM T1,BOTLIN
OR S,ISTATE ;INITIALIZE STATE VECTOR
MOVE P,[IOWD PSL,PS] ;INITIALIZE PUSH-DOWN STACK
PUSHJ P,STCOM3 ;INITIALIZE TABS
OPEN TTY,TTYIO ;OPEN UP TTY CHANNEL
HALT RUNOFF ;CAN'T DO IT, ERROR
OUTPUT TTY, ;DO DUMMY OUTPUT
TYPE [ASCIZ "*"]
PUSHJ P,GFILE ;GET FIRST FILE
MOVSI T1,ADVND
MOVEM T1,OPENO+1 ;USE TTY IN CASE NO OUTPUT DEVICE SPECIFIED
CAIE C,"←" ;IS FIRST FILE NULL?
JRST RUN2 ;YES
JUMPN A1,RUN1 ;NO. JUMP IF DEVICE SPECIFIED
MOVSI A1,ADVND
SKIPE A2 ;IS FILE NAME NULL?
MOVSI A1,ADVFS ;NO. ASSUME DEVICE IS ASSUMED DIRECTORY DEVICE
RUN1: MOVEM A1,OPENO+1 ;STORE OUTPUT DEVICE NAME
MOVEM A2,EB ;STORE OUTPUT FILE NAME
SKIPN A3 ;WAS EXTENSION SPECIFIED?
MOVSI A3,AOEXT ;NO. USE ASSUMED OUTPUT FILE EXTENSION
HLLZM A3,EB+1 ;STORE OUTPUT FILE EXTENSION
SETZM EB+2
MOVEM A4,EB+3 ;STORE DIRECTORY
PUSHJ P,GFILE ;GET SECOND FILE
RUN2: CAIE C,15 ;IS DELIMITER A CR?
JRST SPECER ;NO. ERROR
JUMPN A1,RUN3 ;YES. JUMP IF DEVICE SPECIFIED
MOVSI A1,ADVND
SKIPE A2 ;IS FILE NAME NULL?
MOVSI A1,ADVFS ;NO. ASSUME DEVICE IS ASSUMED DIRECTORY DEVICE
RUN3: MOVEM A1,OPENI+1 ;STORE INPUT DEVICE NAME
MOVEM A2,LB ;STORE INPUT FILE NAME
SKIPN A3 ;WAS EXTENSION SPECIFIED?
MOVSI A3,AIEXT ;NO. USE ASSUMED INPUT FILE EXTENSION
HLLZM A3,LB+1 ;STORE INPUT FILE EXTENSION
SETZM LB+2
MOVEM A4,LB+3 ;STORE DIRECTORY
MOVE A1,OPENI+1 ;A1 = INPUT DEVICE NAME
MOVEI A2,IN ;INITIALIZE I/O ROUTINES
MOVEI A3,INBUF+1
CAME A1,[SIXBIT /TTY/]
JRST OPN1
MOVEI A2,TTY
MOVEI A3,TTYI+1
JRST OPN2
OPN1: OPEN IN,OPENI ;OPEN INPUT CHANNEL IF NOT TTY
JRST OPNERR ;ERROR
INBUF IN,2
LOOKUP IN,LB ;LOOKUP INPUT FILE
JRST LKERR ;ERROR
OPN2: MOVEM A3,IPNT+1
ADDI A3,1
MOVEM A3,IPNT+2
DPB A2,[POINT 4,IPNT,12]
DPB A2,[POINT 4,IPNT+3,12]
MOVE A1,OPENO+1 ;A1 = OUTPUT DEVICE
CAMN A1,[SIXBIT /TTY22/] ;IBM 2741 (UCI)?
JRST .+3 ;YES.
CAME A1,[SIXBIT /2741/] ;SPECIAL TEST FOR IBM 2741
JRST OPN2A ;NO. JUMP
MOVEI T1,10 ;YES. DO OUTPUT IN IMAGE MODE
HRRM T1,OPENO
TLZ SS,UCSHF ;SET LOWER CASE INITIALLY
TRO S,T2741 ;INDICATE OUTPUT TO IBM 2741
MOVEI A1,↑D15 ;SET LEFT MARGIN TO 1.5"
MOVEM A1,LFTMRG
TDZA A1,A1 ;CLEAR A1 AND SKIP
OPN2A: CALLI A1,DEVCHR ;GET OUTPUT DEVICE CHARACTERISTICS
MOVEI T1,100
TLNE A1,40000 ;IS DEVICE A LINE PRINTER?
ORM T1,OPENO ;YES. SUPPRESS SLASHED 0'S
MOVEI A2,OUT
MOVEI A3,OUTBUF+1
TLNN A1,10 ;TAKE SPECIAL ACTION FOR TTY
JRST OPN3
MOVSI T2,'TTY' ;UNTIL SOMETHING BETTER CAN BE DONE
CAME T2,OPENO+1
JRST OPN3
SETO A2,
GETLCH A2
TLNE A2,(1B13)
TRO S,TTY37
MOVEI A2,TTY
MOVEI A3,TTYO+1
JRST OPN4
OPN3: OPEN OUT,OPENO ;OPEN OUTPUT CHANNEL
JRST LPTTST ;ERROR
OPN3A: TRNE S,T2741 ;OUTPUT TO IBM 2741?
OUTBUF OUT,↑D10 ;YES. ALLOCATE 10 BUFFERS
ENTER OUT,EB ;ENTER OUTPUT FILE
JRST ENTERR ;ERROR
OUTPUT OUT, ;DO DUMMY OUTPUT
OPN4: MOVEM A3,OPNT+1
ADDI A3,1
MOVEM A3,OPNT+2
DPB A2,[POINT 4,OPNT,12]
SKIPG T1,@IPNT+2 ;DO WE HAVE AN INPUT BUFFER?
XCT IPNT ;NO. GET IT
MOVE T1,@IPNT+1 ;GET 1ST WORD OF INPUT BUFFER
MOVE T1,1(T1)
TRNE T1,1 ;IS IT A SEQUENCE NUMBER?
TRO S,SEQNO ;YES. SET SEQUENCE NUMBERS SWITCH
MOVE T1,OPENO+1 ;T1 = OUTPUT DEVICE
CALLI T1,DEVCHR ;GET DEVICE CHARACTERISTICS
TLNE T1,10 ;IS DEVICE A TTY?
TRO S,TTY33 ;YES. ASSUME TTY 33
TLNN T1,40000 ;IS DEVICE A LPT?
JRST OPN5 ;NO. SKIP
TRO S,LP10 ;YES. ASSUME LP10
MOVEI T2,↑D15 ;SET LEFT MARGIN TO 1.5"
MOVEM T2,LFTMRG
OPN5: PUSH P,[RUN7] ;FUDGE RETURN TO RUN7
RUN4: TYPE BELL ;RING BELL
MOVEI CNT,6
MOVE PNT,[POINT 6,A1]
MOVEI A1,0
PUSHJ P,GSIXB ;GET COMMAND IN A1
MOVEI CNT,CTL-1 ;LOOKUP COMMAND IN TABLE
RUN5: CAMN A1,CMTBL(CNT) ;HAVE WE FOUND IT?
JRST RUN6 ;YES. TAKE ACTION
SOJGE CNT,RUN5 ;NO. TRY NEXT COMMAND
PUSHJ P,COMER ;NOT FOUND, ERROR
RUN6: PUSHJ P,@CMTBLR(CNT)
JRST RUN4
RUN7: MOVEI C,12 ;C = LF
TRNN S,LP10!LP10E ;LINE PRINTER OUTPUT?
JRST RUN8 ;NO. JUMP
MOVEI C,23 ;YES. USE DC3 INSTEAD OF LF
MOVEI T1,↑D66-PHASE ;T1 = SPACING COUNT TO GET PAGE IN PHASE
OUTC ;GET PAGE IN PHASE
SOJG T1,.-1
RUN8: MOVEM C,LFCHR ;STORE LINE FEED CHARACTER
MOVE T2,LFTMRG ;SET PAGE BIAS
MOVEM T2,PGBIAS
MOVE T2,LINEL
MOVEM T2,ILL ;SAVE INITIAL LINE LENGTH
TRNN S,T2741 ;IBM 2741?
JRST S1 ;NO. JUMP
MOVEI C,CIRCLD ;YES. SET IT IN RECEIVE MODE
SOS @OPNT+2
IDPB C,@OPNT+1
MOVEI C,SHFTLC ;SHIFT TO LOWER CASE
SOS @OPNT+2
IDPB C,@OPNT+1
S1: TRNN S,SEQNO ;ARE THERE SEQUENCE NUMBERS?
JRST .+7 ;NO. SKIP
GETC
GETC
GETC
GETC
GETC
GETC
GETC ;GET FIRST CHARACTER OF LINE
CAIN C,14 ;IGNORE FORM FEEDS
JRST .-2
JNE ".",S7 ;IF NOT COMMAND LINE, JUMP
GETC ;GET NEXT CHARACTER
S1A: SETZB A1,A2 ;GET READY TO SCAN COMMAND
SETZB A3,A4
SETZB A5,NUMARG ;CLEAR NUMERIC ARGUMENT
MOVEI CNT,↑D24
SKIPA PNT,[POINT 6,A1]
S2: GETC ;GET NEXT CHARACTER
JE " ",S2 ;IGNORE SPACES
JNA S3 ;JUMP IF NOT A LETTER
SOJL CNT,S2 ;JUST USE 1ST 24 CHARACTERS
ORI C,40 ;ADJUST FOR UPPER CASE
IDPB C,PNT ;STORE CHARACTER
JRST S2 ;CONTINUE
S3: JN S6 ;IF NUMBER, JUMP
S3A: JE 15,S4 ;IF DELIMITER IS CRLF, PROCESS COMMAND
JE ".",S3B ;IF IT'S A ".", PROCESS COMMAND
GETC ;OTHERWISE IGNORE GARBAGE
JRST S3A
S3B: GETC
S4: MOVEI CNT,0 ;LOOKUP COMMAND
S4A: CAMN A1,COMTAB+4(CNT)
JRST S4B ;ABBREVIATION FOUND
CAMN A1,COMTAB(CNT)
CAME A2,COMTAB+1(CNT)
JRST S5 ;NOT FOUND
CAMN A3,COMTAB+2(CNT)
CAME A4,COMTAB+3(CNT)
JRST S5 ;NOT FOUND, TRY NEXT ENTRY
S4B: HLLZ T1,COMTAB+5(CNT)
PUSH P,COMTAB+5(CNT) ;SAVE COMMAND ADDRESS
PUSH P,T1 ;SAVE NEW MODE BITS
TLNE T1,BREAKM ;BREAK?
PUSHJ P,BRKCOM
POP P,T1 ;T1 = NEW MODE BITS
OR S,T1 ;UPDATE STATE WORD
POP P,T1 ;T1 = COMMAND ADDRESS
TLZ S,BREAKM ;RESET BREAK MODE
PUSHJ P,(T1) ;EXECUTE COMMAND
S4C: JE 15,S1 ;IF LAST CHARACTER A CRLF, START NEW LINE
JRST S1A ;OTHERWISE, CONTINUE COMMAND LINE
S5: ADDI CNT,6 ;INCREMENT TABLE INDEX
CAIGE CNT,COMTBL ;ANY MORE COMMANDS IN TABLE?
JRST S4A ;YES, TRY NEXT
JE 54,S3A
JRST S4C ;COMMAND NOT FOUND, IGNORE IT
S6: MOVEI A5,-"0"(C) ;CONVERT 1ST DIGIT
S6A: GETC
JNN S6B ;IF NOT DIGIT, JUMP
IMULI A5,↑D10
ADDI A5,-"0"(C) ;BUILD NUMBER
JRST S6A ;GET NEXT DIGIT
S6B: MOVEM A5,NUMARG ;SAVE NUMERIC ARGUMENT
JE 54,S4
JRST S3A
S7: JNE " ",S9 ;PARAGRAPH?
JNM FILLM,S9 ;NO PARAGRAPHS IN NOFILL MODE
PUSHJ P,BRKCOM ;YES. BREAK OFF PREVIOUS LINE
SKIPE T1,DENT ;ARE WE ALREADY INDENTED?
ADDM T1,LINEL ;YES. ADJUST LINE LENGTH
MOVEI T1,5 ;INDENT 5 SPACES ON NEXT LINE
TLO S,DENTM
MOVEM T1,DENT
SUB T1,LINEL ;ADJUST LINE LENGTH
MOVNM T1,LINEL
S8: GETC ;GET NEXT CHARACTER
S9: TLNE S,HEADL!CENTRL ;IS LINE EITHER A HEADING OR TO BE CENTERED?
JRST S16 ;YES. PROCESS IT
TRZE S,PPL ;IS LINE A PAGE PREFIX?
JRST S18 ;YES, JUMP
S10: JM FILLM,S11 ;JUMP IF IN FILL MODE
PUSHJ P,ACCUM ;NOFILL, ACCUMULATE SYMBOL
S10A: PUSHJ P,OUTLIN ;OUTPUT LINE
SETZM SYMCNT ;RESET SYMBOL COUNTER
S10B: TLZ S,UCM!ULINEM ;RESET UPPER CASE AND UNDERLINE MODES
JRST S1 ;PROCESS NEXT LINE
S11: TLNN CC,CF ;IS CHARACTER A FILL MODE CHARACTER?
JRST S15 ;NO
S12: PUSHJ P,ACCUM ;YES. ACCUMULATE SYMBOL
MOVE T1,ALNGTH ;GET ACCUMULATED LENGTH
MOVE T2,SYMCNT
LDB T3,PSYML ;T3 = CURRENT SYMBOL LENGTH
ADD T3,T1 ;T3 = SYMBOL LENGTH + ACCUMULATED LENGTH
CAMGE T3,LINEL ;IS SYM LTH + ACCM LTH .GEQ. LINE LENGTH?
AOJA T3,S14 ;NO. T3 = ACCUM LTH + SYM LTH + 1
CAME T3,LINEL ;YES. EQUAL?
JRST S13 ;NO
TRZE S,PSEOS ;YES. SYMBOL END OF SENTENCE?
AOJA T3,S14 ;YES. STORE SYMBOL
MOVEM T3,ALNGTH ;NO. STORE ACCUMULATED LENGTH
PUSHJ P,OUTLIN ;OUTPUT LINE
SETZM SYMCNT
SETZM ALNGTH
JRST S10 ;CONTINUE PROCESSING
S13: TRZE S,PSEOS ;PREVIOUS SYMBOL END OF SENTENCE?
SOS ALNGTH ;YES. DECREMENT ACCUMULATED LENGTH
CAIE T2,2 ;IS SYMBOL COUNT = 2?
SOS ALNGTH ;NO. DECREMENT ACCUMULATED LENGTH
SOS SYMCNT ;FUDGE SYMBOL COUNT FOR OUTLIN
PUSHJ P,OUTLIN ;OUTPUT LINE
AOS T2,SYMCNT ;RE-FUDGE SYMCNT
LDB A1,PSYML ;A1 = SYMBOL LENGTH
ADDI A1,1
MOVEM A1,ALNGTH ;UPDATE ACCUMULATED LENGTH
LDB A1,PSYMC ;A1 = # CHARACTERS IN SYMBOL
ADDI A1,4
IDIVI A1,5 ;A1 = # WORDS OF SYMBOL
ADDI A1,SYMTAB-1 ;A1 = LAST LOC. TO TRANSFER TO
MOVEI T1,SYMTAB
HLL T1,SYMPNT-1(T2) ;T1 = BLT POINTER
BLT T1,(A1) ;MOVE SYMBOL TO START OF TABLE
MOVE T1,SYMPNT-1(T2) ;TRANSFER SYMBOL LENGTH
HRRM T1,SYMPNT
MOVEI T1,1
MOVEM T1,SYMCNT ;SYMCNT = 1
JRST S10
S14: MOVEM T3,ALNGTH ;UPDATE ACCUMULATED LENGTH
TRZ S,PSEOS ;SET PSEOS APPROPRIATELY
TLNE S,SOSM
TRO S,PSEOS
JRST S10 ;CONTINUE PROCESSING
S15: JE " ",S17 ;JUMP IF A SPACE
JE 15,S10B ;IS IT A CRLF?
TLNN CC,CFC ;IS IT A FILL MODE CONTROL CHARACTER?
JRST S8 ;NO. GET NEXT CHARACTER
JRST S12 ;YES. ACCUMULATE SYMBOL
S16: PUSH P,S ;SAVE STATUS
TLZ S,FILLM ;SET NOFILL MODE
PUSHJ P,ACCUM ;ACCUMULATE SYMBOL
POP P,T2
TLNE T2,FILLM ;RESTORE VALUE FOR FILLM
TLO S,FILLM
JRST S10A ;PROCESS AND OUTPUT CENTERED OR HEADER LINE
S17: GETC ;GET NEXT CHARACTER
JRST S11 ;TEST IT
S18: PUSH P,S ;SAVE STATUS
TLZ S,FILLM
PUSHJ P,ACCUM ;ACCUMULATE PAGE PREFIX
POP P,T2
TLNE T2,FILLM ;RESTORE VALUE FOR FILLM
TLO S,FILLM
MOVE T2,SYMCNT ;T2 = SYMBOL INDEX
LDB CNT,PSYMC ;CNT = # CHARACTERS IN PREFIX
HRRM CNT,PPWRD
LDB T1,PSYML ;T1 = LENGTH OF PREFIX
HRLM T1,PPWRD
MOVE T1,[POINT 7,PPBUF]
HRLI PNT,<POINT 7,0>/1B17
HLR PNT,SYMPNT-1(T2)
ILDB T3,PNT ;STORE PAGE PREFIX
IDPB T3,T1
SOJG CNT,.-2
SOS SYMCNT ;DE-ALLOCATE SYMBOL
JRST S1 ;CONTINUE WITH NEXT LINE
OUTLIN: TLZN S,HEADL ;IS LINE A HEADING LINE?
JRST OUTL3 ;NO. JUMP
MOVE PNT,[POINT 7,HEADBF]
LDB A1,[POINT 9,SYMPNT,35]
TLZN S,CENTRL ;SHOULD HEADING BE CENTERED?
JRST OUTL2 ;NO. SKIP
MOVE T1,LINEL ;T1 = LINE LENGTH
TLNE S,DENTM ;INDENT NEXT LINE?
ADD T1,DENT ;YES. ADJUST FOR INDENTATION
SUB T1,A1 ;T1 = LINE LENGTH - SYMBOL LENGTH
ASH T1,-1 ;T1 = T1/2
OUTL1: JUMPLE T1,OUTL2 ;JUMP IF NO SPACES
MOVEI T3," " ;T3 = SPACE
IDPB T3,PNT ;STORE A SPACE
SOJG T1,.-1 ;STORE REMAINING SPACES
OUTL2: MOVE T1,[POINT 7,SYMTAB]
LDB A1,[POINT 9,SYMPNT,26]
ILDB T3,T1 ;STORE HEADING
IDPB T3,PNT
SOJG A1,.-2
SETZ T3,
IDPB T3,PNT ;STORE TERMINATING NULL
POPJ P, ;EXIT
OUTL3: PUSH P,C ;SAVE C
OUTL3A: SKIPE A1,LINENO ;ARE WE AT TOP OF PAGE?
JRST OUTL9 ;NO. CONTINUE
TRZN S,OFIGSW ;YES. SHOULD WE OUTPUT A FIGURE?
JRST OUTL3D ;NONE TO OUTPUT, JUMP
SKIPA PNT,FSIPNT ;YES. PNT = POINTER
OUTL3B: OUTC ;OUTPUT CHARACTER
OUT3B1: ILDB C,PNT ;GET NEXT CHARACTER TO OUTPUT
JUMPN C,OUTL3B ;STOP IF NULL
SOSLE SKPCNT ;ARE WE STILL SKIPPING PAGES?
JRST OUT3B2 ;YES. PROCESS NEXT FIGURE
PUSH P,PNT ;NO. SAVE PNT
TLNE S,STOPM ;SHOULD WE STOP AFTER EACH PAGE?
PUSHJ P,RUN4 ;YES
POP P,PNT ;RESTORE PNT
OUT3B2: SOSL FIGCNT ;ANY FIGURES LEFT?
JRST OUT3B1 ;YES. PROCESS THEM
OUTL3C: MOVE CNT,PAGESV
MOVEM CNT,PAGENO ;RESTORE PAGE NUMBER
OUTL3D: TRNN S,FIGM ;ARE WE PROCESSING A FIGURE?
JRST OUTL3E ;NO. SKIP
TRCE S,FIGFF ;YES. ARE WE AT 2ND TOP MARGIN?
JRST OUTL18 ;YES. EXIT
OUTL3E: MOVE A2,TOPMRG ;A2 = TOP MARGIN
LSHC A2,-1 ;A2 = TOP MARGIN / 2
SKIPL A3
SUBI A2,1
JUMPLE A2,OUTL4 ;OUTPUT UPPER PART OF TOP MARGIN
OUTLF ;OUTPUT A LF
SOJG A2,.-1 ;OUTPUT REMAINING LF'S
OUTL4: JNM HEADM,OUTL6 ;JUMP IF NO HEADING TO OUTPUT
MOVE CNT,LFTMRG ;OUTPUT LEFT MARGIN
JUMPE CNT,.+3
OUTSP
SOJG CNT,.-1
MOVE PNT,[POINT 7,HEADBF]
OUTL5: ILDB C,PNT ;OUTPUT HEADING
JUMPE C,OUTL5A ;JUMP IF NO MORE HEADING
OUTC ;OUTPUT HEADING CHARACTER
JRST OUTL5
OUTL5A: MOVEI C,15
OUTC ;OUTPUT A CR
JRST OUTL7 ;CONTINUE
OUTL6: JNM PNTOP,OUTL7 ;JUMP IF NO PAGE NUMBERS AT TOP
PUSHJ P,OUTPGN ;OUTPUT PAGE NUMBER
JRST OUTL8 ;CONTINUE
OUTL7: OUTLF ;OUTPUT A LF INSTEAD OF PAGE NUMBER
OUTL8: MOVE A2,TOPMRG ;OUTPUT BOTTOM PART OF TOP MARGIN
MOVEM A2,LINENO ;SET LINE POSITION
LSH A2,-1
JUMPE A2,OUTL9
OUTLF
SOJG A2,.-1
OUTL9: JM NPAGEM!SPACEM,OUTL24 ;JUMP IF NEW PAGE OR SPACING
OUTL9A: SKIPG SYMCNT ;ANY SYMBOLS TO OUTPUT?
JRST OUTL18 ;NO. EXIT
MOVE CNT,LFTMRG ;OUTPUT LEFT MARGIN
TLNE S,DENTM ;INDENT OR UNDENT?
ADD CNT,DENT ;YES. ADD INDENTATION OR UNDENTATION
JUMPE CNT,OUTL10
OUTSP
SOJG CNT,.-1
OUTL10: TLZN S,CENTRL ;SHOULD LINE BE CENTERED?
JRST OUTL20 ;NO. SKIP
LDB A1,[POINT 9,SYMPNT,35]
MOVE CNT,LINEL
SUB CNT,A1
ASH CNT,-1
JUMPLE CNT,OUTL11
OUTSP
SOJG CNT,.-1
OUTL11: MOVE PNT,[POINT 7,SYMTAB]
LDB CNT,[POINT 9,SYMPNT,26]
JUMPE CNT,OUTL12
ILDB C,PNT
OUTC
SOJG CNT,.-2
OUTL12: PUSHJ P,OUTPG3 ;OUTPUT A CR LF
MOVE T1,DENT ;T1 = POSSIBLE INDENTATION
TLZE S,DENTM ;WAS LINE INDENTED?
ADDM T1,LINEL ;YES. ADJUST LINE LENGTH
SETZM DENT ;CLEAR INDENTATION AMOUNT
AOS T1,LINENO ;INCREMENT LINE NUMBER
CAMGE T1,BOTLIN ;IS LINE GEQ BOTTOM LINE?
JRST OUTL19 ;NO. CONTINUE
OUTL13: MOVE A2,BOTMRG ;YES. A2 = BOTTOM MARGIN
LSHC A2,-1 ;A2 = BOTTOM MARGIN / 2
SKIPL A3
SUBI A2,1
JUMPLE A2,OUTL14 ;OUTPUT UPPER PART OF BOTTOM MARGIN
OUTLF
SOJG A2,.-1 ;OUTPUT REMAINING LF'S
OUTL14: JNM PNBOT,OUTL15 ;JUMP IF NO PAGE NUMBERS AT BOTTOM
PUSHJ P,OUTPGN ;OUTPUT PAGE NUMBER
JRST OUTL16
OUTL15: OUTLF ;OUTPUT A LF INSTEAD OF PAGE NUMBER
OUTL16: MOVE A2,BOTMRG ;OUTPUT LOWER PART OF BOTTOM MARGIN
LSH A2,-1
JUMPE A2,OUTL17
OUTLF
SOJG A2,.-1
OUTL17: AOS PAGENO ;INCREMENT PAGE NUMBER
SETZM LINENO ;SET LINE TO TOP OF PAGE
TRNE S,FIGM ;ARE WE PROCESSING A FIGURE?
JRST OUTL18 ;YES. EXIT
SOSLE SKPCNT ;DECREMENT PAGE SKIP COUNT
JRST OUTL18 ;IF STILL SKIPPING, EXIT
TLNE S,STOPM ;SHOULD WE STOP AFTER EACH PAGE?
PUSHJ P,RUN4 ;YES. WAIT FOR USER RESPONSE
OUTL18: POP P,C ;RESTORE C
POPJ P, ;EXIT
OUTL19: JNM DSPCM,OUTL18 ;JUMP IF NO DOUBLE SPACING
OUTLF ;OUTPUT ANOTHER LF
AOS T1,LINENO ;INCREMENT LINE NUMBER
CAMGE T1,BOTLIN ;IS LINE GEQ BOTTOM MARGIN LINE?
JRST OUTL18 ;NO. EXIT
JRST OUTL13 ;YES. OUTPUT BOTTOM MARGIN
OUTL20: TRZN S,CENTOL ;CENTER NEXT LINE OF OUTPUT?
JRST OUTL21 ;NO. JUMP
MOVE T2,LINEL ;YES. T2 = LINE LENGTH
SUB T2,ALNGTH
ASH T2,-1 ;T2 = # OF CENTERING SPACES NEEDED
SKIPA C,[" "]
OUTC ;OUTPUT SPACES
SOJGE T2,.-1
JNM FILLM,OUTL11 ;JUMP IF NOT IN FILL MODE
OUTL21: MOVEI T2,1 ;T2 = SYMBOL INDEX
LDB CNT,PSYMC ;OUTPUT 1ST SYMBOL
MOVE PNT,[POINT 7,SYMTAB]
JUMPE CNT,.+4
ILDB C,PNT
OUTC
SOJG CNT,.-2
ADDI T2,1 ;INCREMENT SYMBOL INDEX
MOVE A1,SYMCNT
SOJLE A1,OUTL12 ;IF JUST ONE SYMBOL, EXIT
MOVE A2,LINEL
SUB A2,ALNGTH ;A2 = # OF EXTRA SPACES
IDIV A2,A1 ;A2 = # OF SPACES/REMAINING SYMBOL
HRLZ A4,A3 ;COMPUTE ALLOCATION PROBABILITY
IDIV A4,A1
OUTL22: MOVEI CNT,1 ;SPACE AT LEAST ONE SPACE
JNM JUSTM,OUTL23 ;JUMP IF NOT JUSTIFYING
ADD CNT,A2 ;JUSTIFYING. ADD EXTRA SPACING
JUMPE A3,OUTL23 ;IF NO EXTRA SPACES, JUMP
MOVEI T1,1(A1) ;T1 = # SYMBOLS
SUB T1,T2 ;T1 = # REMAINING SYMBOLS
MOVE C,CLASS(C)
TLNN C,CEST ;WAS LAST SYMBOL'S LAST CHARACTER AN EST?
CAMN T1,A3 ;MUST WE OUTPUT A SPACE?
AOJA CNT,OUTL23-1 ;YES. INCREMENT COUNT AND JUMP
MOVE A5,RMULT ;NO. GENERATE RANDOM NUMBER
IMULB A5,RANDOM
CAIGE A4,(A5) ;SHOULD WE OUTPUT A RANDOM SPACE?
JRST OUTL23 ;NO. SKIP
ADDI CNT,1 ;YES. INCREMENT COUNT
SUBI A3,1 ;DECREMENT REMAINING SPACE COUNT
OUTL23: OUTSP ;OUTPUT SPACES
SOJG CNT,.-1
LDB CNT,PSYMC ;CNT = # CHARACTERS IN SYMBOL
JUMPE CNT,.+6
HRLI PNT,<POINT 7,0>/1B17
HLR PNT,SYMPNT-1(T2)
ILDB C,PNT ;OUTPUT SYMBOL
OUTC
SOJG CNT,.-2
CAME T2,SYMCNT ;WAS THIS THE LAST SYMBOL?
AOJA T2,OUTL22 ;NO. OUTPUT THE NEXT ONE
JRST OUTL12 ;YES. FINISH UP
OUTL24: TLZE S,SPACEM ;SPACE SOME LINES?
MOVE CNT,SPCNT ;YES. GET LINE COUNT
TLZE S,NPAGEM ;SKIP TO NEW PAGE?
MOVE CNT,PAPERL ;YES. USE MAXIMUM COUNT
MOVE T1,TOPMRG
CAMN T1,LINENO ;ARE WE AT TOP OF PAGE?
JRST OUTL9A ;YES. IGNORE SPACING
OUTL25: OUTLF ;NO. OUTPUT LINE SPACING
AOS T1,LINENO ;INCREMENT LINE NUMBER
CAML T1,BOTLIN ;HAVE WE REACHED BOTTOM OF PAGE?
JRST OUTL26 ;YES. SKIP
SOJG CNT,OUTL25 ;NO. HAS COUNT RUN OUT?
JRST OUTL9A ;YES. CONTINUE
OUTL26: MOVEI T1,OUTL3A ;OUTL3A = NORMAL RETURN POINT
TRNE S,LPAGEM ;ARE WE OUTPUTTING THE LAST PAGE?
MOVEI T1,OUTL18 ;YES. FUDGE RETURN POINT TO OUTL18
PUSH P,T1 ;PUT RETURN POINT ON STACK
PUSHJ P,OUTL13 ;OUTPUT BOTTOM MARGIN
OUTPGN: MOVE T1,PAGENO ;GET PAGE NUMBER IN T1
SETZ T3, ;CLEAR DIGIT COUNTER
OUTPG1: IDIVI T1,↑D10
ADDI T3,1 ;INCREMENT DIGIT COUNT
PUSH P,T2 ;STORE DECIMAL DIGIT
JUMPN T1,OUTPG1 ;CONTINUE IF MORE LEFT
MOVE A1,ILL ;A1 = INITIAL LINE LENGTH
TRNN S,PPM ;PREFIX PAGE NUMBER?
JRST OUTP1A ;NO, SKIP
HLRZ A2,PPWRD ;YES, A2 = PREFIX LENGTH
SUB A1,A2
JRST OUTP1B
OUTP1A: SUBI A1,4(T3) ;ALLOW FOR PAGE NUMBER
OUTP1B: LSH A1,-1
ADD A1,PGBIAS ;ADD PAGE MARGIN BIAS
OUTSP
SOJG A1,.-1 ;OUTPUT LEADING SPACES
TRNN S,PPM ;PREFIX PAGE NUMBER?
JRST OUTP1C ;NO, SKIP
MOVE T1,[POINT 7,PPBUF]
HRRZ T2,PPWRD
SOJL T2,OUTPG2
ILDB C,T1
OUTC
JRST .-3
OUTP1C: MOVEI C,"-"
OUTC
OUTSP
OUTPG2: POP P,C ;OUTPUT PAGE NUMBER
ADDI C,"0"
OUTC
SOJG T3,OUTPG2
TRNE S,PPM ;PREFIX PAGE NUMBER?
JRST OUTPG3 ;YES, JUMP
OUTSP
MOVEI C,"-"
OUTC
OUTPG3: MOVEI C,15 ;OUTPUT CR LF
OUTC
TRNN S,T2741
OUTLF
MOVEI C,10
TRNE S,TTY37
JRST COUT
POPJ P,
ACCUM: AOS T1,SYMCNT ;INCREMENT SYMBOL COUNT
LDB A1,[POINT 9,SYMPNT-2(T1),26]
ADDI A1,4
IDIVI A1,5 ;A1=LENGTH OF PREVIOUS SYMBOL IN WORDS
HLRZ SP,SYMPNT-2(T1) ;SP = ADDRESS OF PREVIOUS SYMBOL
ADD SP,A1 ;SP = STARTING ADDRESS OF NEW SYMBOL
HRLZM SP,SYMPNT-1(T1) ;INITIALIZE SYMBOL POINTER
HRLI SP,<POINT 7,0>/1B17 ;INITIALIZE BYTE POINTER
ACCUM1: JA ACCU10 ;JUMP IF A LETTER
JNM FILLM,ACCUM3 ;JUMP IF NOT IN FILL MODE
TLNE CC,CFC ;IS CHAR. A FILL MODE CONTROL CHAR.?
JRST ACCUM4 ;YES. TAKE APPROPRIATE ACTION
TLZ SS,PCSPSW ;NO. RESET PREVIOUS CHARACTER A SPACE
ACCUM2: TLNE CC,CF ;IS CHARACTER NULL IN FILL MODE?
PUSHJ P,STOREC ;NO. STORE IT
GETC ;GET NEXT CHARACTER
JRST ACCUM1 ;CONTINUE
ACCUM3: TLNE CC,CNFC ;IS CHAR. A NOFILL MODE CONTROL CHAR.?
JRST ACCUM4 ;YES
TLNE CC,CNF ;IS CHARACTER NULL IN NOFILL MODE?
ACCU3B: PUSHJ P,STOREC ;NO. STORE IT
ACCU3C: GETC ;GET NEXT CHARACTER
JRST ACCUM1 ;CONTINUE
ACCUM4: JE " ",ACCU15 ;YES. JUMP IF SPACE
JE 15,ACCU16
TLZ SS,PCSPSW
JE "↑",ACCUM6 ;SPECIAL CONTROL CHARACTER
JE ".",ACCU4A
JE 11,ACCU11
JE "?",ACCU4A
JNE "!",ACCUM2 ;IGNORE IT IF NOT A "!"
ACCU4A: PUSHJ P,STOREC ;STORE THE END OF SENTENCE CHARACTER
GETC ;GET NEXT CHARACTER
CAIN C,15 ;IS IT A CRLF?
JRST ACCU4B
CAIE C," " ;OR A " "?
JRST ACCUM1 ;NO. NOT END OF A SENTENCE
JM FILLM,ACCU4B ;JUMP IF FILL MODE
TLO S,SOSM ;SET START OF SENTENCE
JRST ACCU3B ;CONTINUE
ACCU4B: TLO S,SOSM ;IT WAS, SET START OF SENTENCE
ACCUM5: TLNE S,ULINEM ;UNDERLINE SYMBOL?
TRNN S,TTY37!T2741 ;YES. OUTPUT TO TTY 37 OR IBM 2741?
JRST ACCU5A ;NO. JUMP
PUSH P,C ;SAVE CURRENT CHARACTER
PUSH P,CC
LDB A2,[POINT 9,SYMPNT-1(T1),35] ;A2 = SYMBOL LENGTH
MOVE T3,A2 ;COPY SYMBOL LENGTH
MOVEI C,10 ;C = BS
TLO SS,DONTUL ;SET DON'T UNDERLINE SWITCH
PUSHJ P,STOREC ;STORE BACKSPACES
SOJG T3,.-1
MOVEI C,"←" ;C = UNDERLINE CHARACTER
PUSHJ P,STOREC ;STORE UNDERLINE CHARACTERS
SOJG A2,.-1
TLZ SS,DONTUL ;RESET DON'T UNDERLINE SWITCH
POP P,CC ;RESTORE C
POP P,C
ACCU5A: TLNE S,SOSM ;WAS SYMBOL END OF SENTENCE?
TLNN S,FILLM ;YES. IN FILL MODE?
POPJ P, ;NO. EXIT
MOVE T3,ALNGTH ;YES. T3 = ACCUMULATED LENGTH
LDB T2,[POINT 9,SYMPNT-1(T1),35] ;T2 = SYMBOL LENGTH
ADD T3,T2 ;T3 = SYMBOL LENGTH + ACCUMULATED LENGTH
MOVEI T2,1(T3) ;T2 = (T3) + 1
CAME T2,LINEL ;DO WE HAVE TO DO SPECIAL FUDGE?
JRST .+3 ;NO. JUMP
TRO S,PSEOS ;YES. SET PSEOS BIT
JRST .+3 ;JUMP TO ADD A SPACE
CAMN T3,LINEL ;IS (T3) = LINE LENGTH?
JRST ACCU5B ;YES. DON'T ADD AN EXTRA SPACE
MOVEI T2," " ;NO. ADD AN EXTRA SPACE AFTER SYMBOL
IDPB T2,SP
MOVEI T2,1001 ;INCREMENT SYMBOL LENGTH
ADDM T2,SYMPNT-1(T1)
ACCU5B: POPJ P, ;EXIT
ACCUM6: GETC ;GET NEXT CHARACTER
JE "↑",ACCUM2 ;TREAT "↑↑" AS "↑"
JN ACCUM8 ;JUMP IF NUMBER
JA ACCUM7 ;JUMP IF ALPHABETIC
JE "-",ACCU6A
JE "←",ACCU6C
PUSH P,C ;SAVE CHARACTER
MOVEI C,"↑"
PUSHJ P,STOREC ;STORE A "↑"
POP P,C ;RESTORE CHARACTER
JRST ACCUM1 ;CONTINUE
ACCU6A: TRC S,UCS ;COMPLEMENT UPPER CASE SHIFT BIT
ACCU6B: GETC ;GET NEXT CHARACTER
JRST ACCUM1 ;CONTINUE PROCESSING
ACCU6C: TRNE S,TTY37!T2741 ;CAN DEVICE DO UNDERLINING?
TRC S,ULS ;YES. COMPLEMENT UNDERLINE SHIFT BIT
JRST ACCU6B ;CONTINUE
ACCUM7: TLZ S,SOSM ;RESET START OF SENTENCE MODE
ANDI C,137 ;CAPITALIZE LETTER
JRST ACCUM2 ;CONTINUE
ACCUM8: MOVEI A1,-"0"(C) ;A1 = VALUE OF 1ST DIGIT
GETC ;GET NEXT CHARACTER
JNN ACCUM9 ;JUMP IF NOT NUMERIC
LSH A1,3 ;DO MULTIPLY BY 8
ADDI A1,-"0"(C) ;ACCUMULATE 2ND OCTAL DIGIT
GETC
JNN ACCUM9 ;JUMP IF NOT NUMERIC
LSH A1,3
ADDI A1,-"0"(C) ;ACCUMULATE 3RD OCTAL DIGIT
GETC
ACCUM9: PUSH P,C ;SAVE TERMINATING CHARACTER
CAIL A1,200 ;IS VALUE WITHIN RANGE?
MOVEI A1,"?" ;NO. CHANGE IT TO A "?"
MOVE C,CLASS(A1)
TRNE S,LP10E ;OUTPUT TO A LP10E PRINTER?
TLNN C,CLPEH ;YES. IS CHARACTER A HIDDEN ONE?
JRST ACCM9A ;NO. CONTINUE
MOVEI C,177 ;YES. PREFIX IT WITH A DELETE
IDPB C,SP
IDPB A1,SP ;STORE HIDDEN CHARACTER
MOVEI A1,2001
ADDM A1,SYMPNT-1(T1) ;INCREMENT SYMBOL LENGTH
JRST ACCM9B ;CONTINUE
ACCM9A: MOVE C,A1 ;GET SPECIAL CODE
PUSHJ P,STOREC ;OUTPUT IT
ACCM9B: POP P,C ;RESTORE CHARACTER
JRST ACCUM1 ;CONTINUE
ACCU10: TLZ SS,PCSPSW ;RESET PREVIOUS CHARACTER A SPACE
TLNE S,LOWCM ;LOWER CASE MODE?
ORI C,40 ;YES. CONVERT TO LOWER CASE
TDNE S,[UCM,,UCS] ;UPPER CASE MODE OR UPPER CASE SHIFT?
ANDI C,137 ;YES. CONVERT TO UPPER CASE
TLZE S,SOSM ;START OF SENTENCE MODE?
TLNN S,CAPSM ;YES. CAPITALIZE SENTENCES?
JRST ACCUM2 ;NO. STORE IT
ANDI C,137 ;YES. CONVERT TO UPPER CASE
JRST ACCUM2 ;STORE IT
ACCU11: JNM FILLM,ACCU12 ;JUMP IF NOFILL MODE
JM JUSTM,ACCU14 ;JUMP IF FILL AND JUSTIFY MODES
ACCU12: LDB C,[POINT 9,SYMPNT-1(T1),35]
ADD C,ALNGTH ;C = CURRENT LINE POSITION
MOVEI CC,1 ;INITIALIZE TAB SPACE COUNT
ACCU13: ADDI C,1 ;DO TAB SIMULATION
CAMGE C,LINEL
SKIPE TABTBL+1(C)
JRST .+2
AOJA CC,ACCU13
MOVEI C," " ;STORE NECESSARY SPACES
PUSHJ P,STOREC
SOJG CC,.-1
JRST ACCU3C
ACCU14: MOVEI C," " ;TREAT TAB AS A SPACE IN JUSTIFY MODE
MOVE CC,CLASS+" "
JRST ACCUM1
ACCU15: TLO SS,PCSPSW ;SET PREVIOUS CHARACTER A SPACE
JRST ACCUM5 ;CONTINUE
ACCU16: TLZN SS,PCSPSW ;WAS PREVIOUS CHARACTER NOT A SPACE?
TLNN SS,SSALSW ;YES. SPLIT SYMBOLS ACROSS LINES?
JRST ACCUM5 ;NO. CONTINUE NORMALLY
JNM FILLM,ACCUM5 ;IGNORE SPECIAL PROCESSING IF NOFILL
GETC ;GOBBLE CRLF
JRST ACCUM1 ;CONTINUE PROCESSING
STOREC: IDPB C,SP ;STORE CHARACTER IN SYMBOL
LDB A1,[POINT 2,CLASS(C),14]
ADDI A1,1000-1
TRNN S,ULS ;UNDERLINE SHIFT?
JRST STORE1 ;NO. JUMP
TRNE S,TTY37!T2741 ;YES. TTY37 OR IBM2741?
TLNE SS,DONTUL ;YES. CAN WE UNDERLINE?
JRST STORE1 ;NO. JUMP
PUSH P,C ;YES. UNDERLINE CHARACTER
MOVEI C,10
IDPB C,SP
MOVEI C,"←"
IDPB C,SP
ADDI A1,2000 ;UPDATE SYMBOL CHARACTER COUNT
POP P,C ;RESTORE C
STORE1: ADDM A1,SYMPNT-1(T1) ;UPDATE SYMBOL LENGTH
POPJ P, ;EXIT
; GET: <DEVICE>:<FILE>.<EXT>[<PROJECT>,<PROGRAMMER>]
;
; PUSHJ P,GFILE
;
; RETURN: A1= SIXBIT /<DEVICE>/
; A2= SIXBIT /<FILE>/
; A3= SIXBIT /<EXT>/
; A4= XWD <PROJECT>,<PROGRAMMER>
; C = DELIMITER
GFILE: SETZB A1,A2 ;CLEAR ACCUMULATORS
SETZB A3,A4
MOVEI CNT,6
MOVE PNT,[POINT 6,A1]
PUSHJ P,GSIXB ;GET POSSIBLE DEVICE NAME
CAIE C,":" ;WAS IT REALLY THE DEVICE NAME?
JRST GFILE3 ;NO. MUST BE FILE NAME
MOVEI CNT,6 ;YES. PROCESS FILE NAME
MOVE PNT,[POINT 6,A2]
PUSHJ P,GSIXB ;GET FILE NAME
GFILE1: CAIE C,"." ;ANY EXTENSION?
JRST GFILE2 ;NO. SKIP EXTENSION SCAN
MOVEI A3,-1 ;YES. SET EXTENSION SPECIFIED
MOVEI CNT,3
MOVE PNT,[POINT 6,A3]
PUSHJ P,GSIXB ;GET FILE EXTENSION
GFILE2: CAIE C,"[" ;DIRECTORY SPECIFIED?
POPJ P, ;NO. EXIT
PUSHJ P,OCTIN ;GET PROJECT #
CAIE C,"," ;DELIMITER A ","?
JRST SPECER ;NO. ERROR
HRL A4,T2 ;STORE PROJECT #
PUSHJ P,OCTIN ;GET PROGRAMMER #
CAIE C,"]" ;DELIMITER A "]"?
JRST SPECER ;NO. ERROR
HRR A4,T2 ;YES. STORE PROGRAMMER #
GET ;GET NEXT DELIMITER
POPJ P, ;EXIT
GFILE3: EXCH A1,A2 ;EXCHANGE DEVICE AND FILE NAMES
JRST GFILE1 ;CONTINUE
; GET SIXBIT NAME
;
; MOVEI CNT,<MAX CHARACTER COUNT>
; MOVE PNT,[BYTE POINTER]
; PUSHJ P,GSIXB
;
; RETURNS C = DELIMITER
; NAME STORED IN AREA POINTED TO BY [BYTE POINTER]
GSIXB0: SUBI C,40 ;CONVERT TO SIXBIT CODE
SOJL CNT,GSIXB ;CHECK COUNT
IDPB C,PNT ;STORE IT
GSIXB: GET ;GET CHARACTER IN C
CAIG C,"9" ;IS IT A NUMBER?
CAIGE C,"0"
JRST GSIXB1 ;NO
JRST GSIXB0 ;YES
GSIXB1: CAIG C,"Z" ;IS IT AN UPPER CASE LETTER?
CAIGE C,"A"
JRST GSIXB2 ;NO
JRST GSIXB0 ;YES
GSIXB2: CAIG C,"Z"+40 ;IS IT A LOWER CASE LETTER?
CAIGE C,"A"+40
POPJ P, ;NO. EXIT
SUBI C,40 ;YES. CHANGE IT TO UPPER CASE
JRST GSIXB0
; GET OCTAL (DECIMAL) NUMBER IN T2
OCTIN: SKIPA T1,[↑D8] ;OCTAL INPUT
DECIN: MOVEI T1,↑D10 ;DECIMAL INPUT
MOVEI T2,0
DECIN1: GET ;GET CHARACTER
CAIG C,"0"-1(T1) ;IS IT A LEGAL NUMBER?
CAIGE C,"0"
POPJ P, ;NO. EXIT
IMUL T2,T1 ;YES. ACCUMULATE THIS NUMBER
ADDI T2,-"0"(C)
JRST DECIN1 ;PROCESS NEXT NUMBER
; OUTPUT ROUTINE
COUTLF: SKIPA C,LFCHR ;OUTPUT A LF
COUTSP: MOVEI C," " ;OUTPUT A SPACE
COUT: TRNE S,FIGM ;ARE WE PROCESSING A FIGURE?
JRST COUT4 ;YES. TAKE SPECIAL ACTION
SKIPLE SKPCNT ;ARE WE IN SKIP MODE?
POPJ P, ;YES. IGNORE OUTPUT
COUT0: CAIE C,11 ;TAB BEING OUTPUT?
JRST COUT00 ;NO. SKIP
PUSH P,C ;YES. SAVE C, CC
PUSH P,CC
MOVE CC,HPOS ;CC = HORIZONTAL POSITION
SUB CC,LFTMRG ;SUBTRACT LEFT MARGIN VALUE
ANDI CC,7 ;CC = MOD(CC,8)
SUBI CC,↑D8 ;CC = - SPACES NEEDED TO SIMULATE TAB
MOVEM CC,SPCTR ;SAVE NEGATIVE COUNT
MOVEI C," "
MOVE CC,CLASS+" "
PUSHJ P,COUT ;OUTPUT SPACES
AOSGE SPCTR
JRST .-2
JRST COUT1B ;FINISHED. EXIT
COUT00: PUSH P,CC ;SAVE CC
LDB CC,[POINT 2,CLASS(C),14] ;CC = LENGTH BITS
SUBI CC,1
ADDM CC,HPOS ;ADJUST HORIZONTAL POSITION
POP P,CC ;RESTORE CC
TRNN S,T2741 ;OUTPUTTING TO IBM 2741?
JRST COUT1 ;NO. JUMP
PUSH P,C ;YES. SAVE C
PUSH P,CC ;SAVE CC
COUT01: MOVE CC,@P2741 ;CC = 2741 CHARACTER INFO
TRNN CC,1B18 ;IS CHARACTER UPPER CASE?
JRST COUT0A ;NO. JUMP
TLNE SS,UCSHF ;YES. IS 2741 IN UPPER CASE?
JRST COUT0C ;YES. DON'T HAVE TO SWITCH TO UPPER CASE
MOVEI C,SHFTUC ;C = UPPER CASE SHIFT CODE
JRST COUT0B ;OUTPUT IT, AND CONTINUE
COUT0A: TRNE CC,1B19 ;IS CHARACTER LOWER CASE?
TLNN SS,UCSHF ;YES. IS 2741 IN LOWER CASE?
JRST COUT0C ;DON'T HAVE TO SWITCH
MOVEI C,SHFTLC ;NO. C = LOWER CASE SHIFT CODE
COUT0B: PUSHJ P,COUT2 ;OUTPUT CASE SHIFT CODE
TLC SS,UCSHF ;COMPLEMENT SHIFT BIT
COUT0C: MOVE C,CC ;C = CHARACTER TO BE OUTPUT
PUSHJ P,COUT2 ;OUTPUT IT
TLZN CC,4 ;OUTPUTING "!"?
JRST COUT0D ;NO. JUMP
MOVEI C,BKSPC ;YES. OUTPUT BACKSPACE
PUSHJ P,COUT2
MOVEI C,"." ;OUTPUT A "."
JRST COUT01
COUT0D: HLRZS CC ;CC = IDLE CHARACTER COUNT
CAIG CC,1 ;MORE THAN 1 IDLE?
JRST COUT0E ;NO. JUMP
MOVE C,HPOS ;YES. ASSUME CARRIAGE RETURN
IDIVI C,↑D10 ;COMPUTE IDLE COUNT
MOVEI CC,2(C)
SETZM HPOS ;RESET HORIZONTAL POSITION
COUT0E: SOJGE CC,COUT0F ;DECREMENT COUNT, ANY LEFT?
POP P,CC ;NO. RESTORE CC
POP P,C ;RESTORE C
POPJ P, ;EXIT
COUT0F: MOVEI C,IDLEC ;C = IDLE CHARACTER
PUSHJ P,COUT2 ;OUTPUT IT
JRST COUT0E ;GO BACK FOR MORE
COUT1: CAIN C,15 ;CARRIAGE RETURN?
SETZM HPOS ;YES. RESET HORIZONTAL POSITION
PUSHJ P,COUT2 ;OUTPUT C
TRNN S,CRSW!SLWSW ;ANY SPECIAL PROCESSING?
POPJ P, ;NO. EXIT
PUSH P,C ;SAVE C
PUSH P,CC ;SAVE CC IN CASE SOMEONE USING IT
TRNN S,CRSW ;CARRIAGE RETURN PROCESSING?
JRST COUT1D ;NO. CONTINUE
CAIE C,12 ;YES. IS CHARACTER A LINE FEED?
JRST COUT1C ;NO. CONTINUE
MOVEI C,15 ;YES. SEND OUT EXTRA CARRIAGE RETURNS
MOVE CC,CRCNT ;CC HAS COUNT
COUT1A: PUSHJ P,COUT6 ;DO IT
COUT1B: POP P,CC ;RESTORE CC
POP P,C ;RESTORE C
POPJ P, ;EXIT
COUT1C: TRNN S,SLWSW ;SLOW MODE?
JRST COUT1B ;NO. EXIT
COUT1D: MOVEI C,37 ;YES. SEND OUT UNIT SEPARATORS
MOVE CC,SLWCNT ;CC HAS COUNT
JRST COUT1A ;DO IT
COUT6: SOSGE @OPNT+2 ;INCREMENT BYTE COUNT
JRST COUT6A ;NO MORE SPACE IN BUFFER
IDPB C,@OPNT+1 ;DEPOSIT CHARACTER IN BUFFER
SOJG CC,COUT6 ;DECREMENT COUNT AND LOOP BACK
POPJ P, ;FINISHED. EXIT
COUT6A: XCT OPNT ;OUTPUT THE BUFFER
JRST COUT6 ;OUTPUT OKAY, STORE CHARACTER
JRST COUT3 ;OUTPUT ERROR
COUT2: SOSGE @OPNT+2 ;INCREMENT ITEM COUNT
JRST COUT2B ;NONE LEFT, JUMP
COUT2A: IDPB C,@OPNT+1 ;STORE CHARACTER IN BUFFER
POPJ P, ;EXIT
COUT2B: XCT OPNT ;OUTPUT FILLED BUFFER
JRST COUT2 ;RETURN TO STORE CHARACTER
COUT3: MOVEI PNT,[ASCIZ /Output error!/]
JRST ERRTYP
COUT4: SOSGE FSCNT ;HAVE WE RUN OUT OF SPACE YET?
JRST COUT5 ;YES. GET SOME MORE
COUT4A: IDPB C,FSPNT ;NO. STORE CHARACTER
POPJ P, ;EXIT
COUT5: PUSH P,T1 ;SAVE T1
HRRZ T1,JOBREL
ADDI T1,2000
CALLI T1,CORE ;GET ANOTHER K OF CORE
HALT .
MOVEI T1,11777
MOVEM T1,FSCNT ;COMPUTE NEW COUNT
POP P,T1 ;RESTORE T1
JRST COUT4A ;CONTINUE
; INPUT ROUTINE
CIN: TLNN SS,ODLYSP ;OUTPUT DELAYED SPACES?
JRST CIN0 ;NO. SKIP
SOSGE DLYSCT ;DECREMENT DELAYED SPACES COUNT
JRST CIN7 ;NONE LEFT, JUMP
MOVEI C," " ;TRANSMIT A SPACE
JRST CIN1A
CIN0: SOSGE @IPNT+2 ;DECREMENT BYTE COUNT
JRST CIN2 ;NO MORE CHARACTERS IN THIS BUFFER
CIN1: ILDB C,@IPNT+1 ;GET NEXT CHARACTER
JUMPE C,CIN ;IGNORE NULS
TLNE SS,CARDIN ;INPUT FROM CARDS?
JRST CIN5 ;YES. TAKE SPECIAL ACTION
CIN1A: MOVE CC,CLASS(C) ;CC = CHARACTER CLASS WORD
CAIE C,15 ;CR?
POPJ P, ;EXIT
PUSHJ P,CIN ;GOBBLE UP LF
MOVEI C,15
MOVE CC,CLASS(C) ;CC = CHARACTER CLASS WORD
POPJ P,
CIN2: XCT IPNT ;INPUT BUFFER
JRST CIN ;INPUT OKAY, CONTINUE
CIN3: XCT IPNT+3 ;CHECK STATUS
JRST CIN4 ;ERROR
JRST CINEOF ;EOF
CIN4: MOVEI PNT,[ASCIZ /Input error!/]
JRST ERRTYP
CIN5: JM FILLM,CIN1A ;DO NOTHING SPECIAL IF IN FILL MODE
CAIE C," " ;DO WE HAVE A SPACE?
JRST CIN6 ;NO. SKIP
TLON SS,DLYSPC ;YES. ALREADY SOME DELAYED?
SETZM DLYSCT ;NO. INITIALIZE COUNTER
AOS DLYSCT ;INCREMENT DELAYED SPACE COUNT
JRST CIN ;GET NEXT CHARACTER
CIN6: TLZE SS,DLYSPC ;ANY DELAYED SPACES?
CAIN C,15 ;YES. NOT END OF LINE?
JRST CIN1A ;NO. TAKE NO SPECIAL ACTION
TLO SS,ODLYSP ;YES. SET TO OUTPUT DELAYED SPACES
MOVEM C,CSAVE ;SAVE CURRENT CHARACTER
JRST CIN ;DO IT
CIN7: MOVE C,CSAVE ;RESTORE SAVED CHARACTER
TLZ SS,ODLYSP ;RESET OUTPUT DELAYED SPACES MODE
JRST CIN1A ;TRANSMIT CHARACTER
CINEOF: PUSHJ P,BRKCOM ;BREAK OFF PREVIOUS LINE
TLO S,NPAGEM ;SET SKIP TO NEW PAGE MODE
TRO S,LPAGEM ;SET LAST PAGE MODE
PUSHJ P,OUTLIN ;OUTPUT REMAINDER OF LAST PAGE
RELEAS OUT, ;RELEASE OUTPUT CHANNEL
RELEAS TTY,
JRST RUNOFF ;PROCESS NEXT FILE
; TYPE STRING ROUTINE
TYPEIT: ILDB C,PNT ;GET NEXT CHARACTER
JUMPE C,TYPE2 ;EXIT ON ZERO CHARACTER
SOSG TTYO+2 ;HAVE WE EXCEEDED THE BUFFER?
OUTPUT TTY, ;YES. OUTPUT THE BUFFER
TYPE1: IDPB C,TTYO+1 ;STORE CHARACTER IN BUFFER
JRST TYPEIT ;PROCESS NEXT CHARACTER
TYPE2: OUTPUT TTY, ;CLOSE OUT BUFFER
POPJ P, ;EXIT
; INPUT A CHARACTER
GETIT: SOSGE TTYI+2 ;ANY MORE CHARACTERS IN BUFFER?
INPUT TTY, ;NO. GET A NEW BUFFER
GET1: ILDB C,TTYI+1 ;GET CHARACTER IN C
JUMPE C,GETIT ;IGNORE NUL
CAIE C,15
POPJ P, ;EXIT
PUSHJ P,GETIT ;GOBBLE UP LF
MOVEI C,15
POPJ P, ;EXIT
; TABLE OF DIRECT COMMANDS TO RUNOFF
CMTBL: SIXBIT "BALL" ;INDICATE BALL TYPE ON IBM2741
SIXBIT "BM" ;SET BOTTOM MARGIN
SIXBIT "CARDIN" ;CARD INPUT MODE
SIXBIT "CR" ;FORCE CARRIAGE RETURN
SIXBIT "DONE" ;STOP PROCESSING AND EXIT TO MONITOR
SIXBIT "LL" ;SET LINE LENGTH
SIXBIT "LM" ;SET LEFT MARGIN
SIXBIT "LP10" ;OUTPUT TO REGULAR 64 CHARACTER LINE PRINTER
SIXBIT "LP10E" ;OUTPUT IN FULL ASCII ON LP10E PRINTER
SIXBIT "NOSTOP" ;SET MODE TO NOT STOP AFTER EACH PAGE
SIXBIT "PL" ;SET PAGE LENGTH
SIXBIT "SKIP" ;SKIP SPECIFIED NUMBER OF PAGES
SIXBIT "SLOW" ;SLOW DOWN OUTPUT OF EACH CHARACTER
SIXBIT "SSAL" ;SPLIT SYMBOLS ACROSS LINES
SIXBIT "TM" ;SET TOP MARGIN
SIXBIT "TTY33" ;OUTPUT IN MODEL 33 TELETYPE CHARACTER SET
SIXBIT "TTY37" ;OUTPUT IN MODEL 37 TELETYPE CHARACTER SET
SIXBIT " " ;CONTINUE PROCESSING
CTL=.-CMTBL
; DIRECT COMMAND DISPATCH TABLE
CMTBLR: BALCOM
BMCOM
CRDICM
CRCOM
DONCOM
LLCOM
LMCOM
LPCOM
LPECOM
NSTCOM
PLCOM
SKPCOM
SLWCOM
SSALCM
TMCOM
T33COM
T37COM
CNTCOM
; DONE<CRLF>
DONCOM: RELEASE IN, ;CLOSE AND RELEASE CHANNELS
RELEASE OUT,
RELEASE TTY,
CALLI EXIT ;EXIT TO MONITOR
; NOSTOP<CRLF>
NSTCOM: TLZ S,STOPM ;CLEAR STOP MODE BIT
POPJ P,
; SSAL<CRLF>
SSALCM: TLO SS,SSALSW ;SET SPLIT SYMBOLS ACROSS LINES MODE
POPJ P,
; CARDIN<CRLF>
CRDICM: TLO SS,CARDIN ;SET CARD INPUT MODE
POPJ P,
; SKIP <N><CRLF>
SKPCOM: MOVEI T1,1 ;ASSUME COUNT OF 1
MOVEM T1,SKPCNT
CAIN C,15 ;CR?
POPJ P, ;YES
PUSHJ P,GETNUM ;NO. GET <N>
MOVEM T2,SKPCNT ;STORE PAGE SKIP COUNT
POPJ P,
; <CRLF>
CNTCOM: CAIE C,15 ;IS DELIMITER A CR?
JRST COMER ;NO, ERROR
POP P,T1
POPJ P, ;CONTINUE PROCESSING
; LP10<CRLF>
LPCOM: TRZ S,TTY33!TTY37!LP10E
TRO S,LP10
LPCOM1: MOVEI T1,23 ;T1 = DC3
MOVEM T1,LFCHR
POPJ P, ;EXIT
; LP10E<CRLF>
LPECOM: TRZ S,TTY33!TTY37!LP10
TRO S,LP10E
JRST LPCOM1
; BM <N><CRLF>
BMCOM: PUSHJ P,GETNUM ;GET BOTTOM MARGIN
JRST BMRCOM ;STORE IT
; LL <N><CRLF>
LLCOM: PUSHJ P,GETNUM ;GET LINE LENGTH
CAILE T2,MAXLL ;DOES IT EXCEED MAXIMUM?
JRST LLCOM1 ;YES, ERROR
MOVEM T2,LINEL ;NO, STORE IT
POPJ P,
LLCOM1: TYPE [ASCIZ /Line length is too long!/]
TYPE CRLF
JRST COMER
; LM <N><CRLF>
LMCOM: PUSHJ P,GETNUM ;GET LEFT MARGIN
MOVEM T2,LFTMRG ;STORE IT
POPJ P, ;EXIT
; PL <N><CRLF>
PLCOM: PUSHJ P,GETNUM ;GET PAGE LENGTH
JRST PRLCOM ;STORE IT
; TM <N><CRLF>
TMCOM: PUSHJ P,GETNUM ;GET TOP MARGIN
JRST TMRCOM ;STORE IT
; TTY33<CRLF>
T33COM: TRZ S,LP10!LP10E!TTY37
TRO S,TTY33 ;OUTPUT IN TTY 33 CHARACTER SET
JRST T37CM1
; TTY37<CRLF>
T37COM: TRZ S,LP10!LP10E!TTY33
TRO S,TTY37 ;OUTPUT IN TTY 37 CHARACTER SET
T37CM1: MOVEI T1,12
MOVEM T1,LFCHR
POPJ P, ;EXIT
; CR <N><CRLF>
CRCOM: TRZ S,CRSW ;RESET SWITCH
CAIN C,15 ;ANY ARGUMENT?
POPJ P, ;NO. EXIT
PUSHJ P,GETNUM ;YES. GET IT
JUMPE T2,CRCOM ;IF 0, RESET SWITCH
TRO S,CRSW ;SET SWITCH
MOVEM T2,CRCNT ;STORE CARRIAGE RETURN COUNT
POPJ P, ;EXIT
; SLOW <N><CRLF>
SLWCOM: TRZ S,SLWSW ;RESET SWITCH
CAIN C,15 ;ANY ARGUMENT?
POPJ P, ;NO. EXIT
PUSHJ P,GETNUM ;YES. GET IT
JUMPE T2,SLWCOM ;IF 0, RESET SWITCH
TRO S,SLWSW ;SET SWITCH
MOVEM T2,SLWCNT ;STORE DELAY COUNT
POPJ P, ;EXIT
; BALL <N><CRLF>
BALCOM: CAIN C,15 ;ANY ARGUMENT?
POPJ P, ;NO. EXIT
PUSHJ P,GETNUM ;YES. GET ARGUMENT IN T2
CAIG T2,N2741 ;BALL # TOO GREAT?
SOSGE T2 ; OR TOO SMALL?
POPJ P, ;YES. EXIT
MOVE T2,TB2741(T2) ;NO. STORE POINTER TO TRANSLATION TABLE
HRRM T2,P2741
POPJ P, ;EXIT
GETNUM: CAIE C," " ;SHOULD BE A SPACE SEPARATOR
JRST COMER0 ;NOT THERE, ERROR
PUSHJ P,DECIN ;GET NUMBER IN T2
CAIE C,15 ;IS DELIMITER A CR?
JRST COMER0 ;NO. ERROR
MOVEM T2,NUMARG ;YES. STORE NUMERIC ARGUMENT
POPJ P, ;EXIT
; TRANSLATION TABLE: ASCII TO IBM 2741 (JOSS)
DEFINE JOSS(ASCII,D),<
IF2,<
XLIST
BC=0
BB=0
BA=0
B8=0
B4=0
B2=0
B1=0
BLC=0
BUC=0
BIC=0
IRP D<
IFIDN <D> <C>,<BC=1>
IFIDN <D> <B>,<BB=1>
IFIDN <D> <A>,<BA=1>
IFIDN <D> <8>,<B8=1>
IFIDN <D> <4>,<B4=1>
IFIDN <D> <2>,<B2=1>
IFIDN <D> <1>,<B1=1>
IFIDN <D> <LC>,<BLC=1>
IFIDN <D> <UC>,<BUC=1>
IFIDN <D> <I>,<BIC=1>
IFIDN <D> <CR>,<BIC=2>
IFIDN <D> <EXCL>,<BIC=4>
>
J'ASCII=<BYTE (18) BIC (1) BUC,BLC (8) 0 (1) 1,BC,B1,B2,B4,B8,BA,BB>
LIST
BYTE (18) BIC (1) BUC,BLC (8) 0,J'ASCII&377
>
IF1,<BLOCK 1>
>
TB2741: BALL1
BALL2
BALL3
BALL4
N2741=.-TB2741
BALL1: ;JOSS BALL (#934)
JOSS 000,<B,8,4,2,1>
JOSS 001,<B,8,4,2,1>
JOSS 002,<B,8,4,2,1>
JOSS 003,<B,8,4,2,1>
JOSS 004,<B,8,4,2,1>
JOSS 005,<B,8,4,2,1>
JOSS 006,<B,8,4,2,1>
JOSS 007,<B,8,4,2,1>
JOSS 010,<C,B,8,4,2>
JOSS 011,<B,8,4,2,1>
JOSS 012,<I,C,A,8,4,1>
JOSS 013,<B,8,4,2,1>
JOSS 014,<B,8,4,2,1>
JOSS 015,<CR,C,B,8,4,1>
JOSS 016,<I,C,8,4>
JOSS 017,<I,C,B,A,8,4>
JOSS 020,<B,8,4,2,1>
JOSS 021,<B,8,4,2,1>
JOSS 022,<B,8,4,2,1>
JOSS 023,<B,8,4,2,1>
JOSS 024,<B,8,4,2,1>
JOSS 025,<B,8,4,2,1>
JOSS 026,<B,8,4,2,1>
JOSS 027,<B,8,4,2,1>
JOSS 030,<B,8,4,2,1>
JOSS 031,<B,8,4,2,1>
JOSS 032,<B,8,4,2,1>
JOSS 033,<B,8,4,2,1>
JOSS 034,<B,8,4,2,1>
JOSS 035,<B,8,4,2,1>
JOSS 036,<B,8,4,2,1>
JOSS 037,<B,8,4,2,1>
JOSS 040,<C>
JOSS 041,<EXCL,UC,1>
JOSS 042,<UC,2>
JOSS 043,<UC,C,2,1>
JOSS 044,<UC,8>
JOSS 045,<UC,4>
JOSS 046,<UC,C,4,2>
JOSS 047,<UC,1>
JOSS 050,<UC,8,2,1>
JOSS 051,<UC,C,8,1>
JOSS 052,<UC,B,A,2>
JOSS 053,<LC,B,A,2>
JOSS 054,<LC,B,A,4,2,1>
JOSS 055,<LC,B,A,8,2,1>
JOSS 056,<LC,C,B,2>
JOSS 057,<LC,B,A,8>
JOSS 060,<LC,C,8,1>
JOSS 061,<LC,1>
JOSS 062,<LC,2>
JOSS 063,<LC,C,2,1>
JOSS 064,<LC,8>
JOSS 065,<LC,4>
JOSS 066,<LC,C,4,2>
JOSS 067,<LC,C,4,1>
JOSS 070,<LC,4,2,1>
JOSS 071,<LC,8,2,1>
JOSS 072,<UC,C,B,A,4,1>
JOSS 073,<LC,C,B,A,4,1>
JOSS 074,<UC,C,4,1>
JOSS 075,<LC,C,B,4>
JOSS 076,<UC,4,2,1>
JOSS 077,<UC,B,A,8>
JOSS 100,<UC,C,B,4>
JOSS 101,<UC,C,B,4,2,1>
JOSS 102,<UC,C,A,8,2,1>
JOSS 103,<UC,C,A,4,2,1>
JOSS 104,<UC,A,4,1>
JOSS 105,<UC,C,A,4>
JOSS 106,<UC,C,B,A,2,1>
JOSS 107,<UC,B,A,1>
JOSS 110,<UC,A,8,1>
JOSS 111,<UC,B,4,2>
JOSS 112,<UC,C,B,A>
JOSS 113,<UC,A,4,2>
JOSS 114,<UC,C,A,8>
JOSS 115,<UC,C,B,1>
JOSS 116,<UC,C,A,2>
JOSS 117,<UC,C,B,8>
JOSS 120,<UC,B,A,4>
JOSS 121,<UC,C,B,A,4,2>
JOSS 122,<UC,B,4,1>
JOSS 123,<UC,B,8,1>
JOSS 124,<UC,A>
JOSS 125,<UC,A,2,1>
JOSS 126,<UC,B,2,1>
JOSS 127,<UC,C,B,8,2,1>
JOSS 130,<UC,C,A,1>
JOSS 131,<UC,C,B,A,8,1>
JOSS 132,<UC,C,8,2>
JOSS 133,<UC,B,A,4,2,1>
JOSS 134,<UC,B>
JOSS 135,<UC,C,B,2>
JOSS 136,<UC,B>
JOSS 137,<UC,B,A,8,2,1>
JOSS 140,<UC,1>
JOSS 141,<LC,C,B,4,2,1>
JOSS 142,<LC,C,A,8,2,1>
JOSS 143,<LC,C,A,4,2,1>
JOSS 144,<LC,A,4,1>
JOSS 145,<LC,C,A,4>
JOSS 146,<LC,C,B,A,2,1>
JOSS 147,<LC,B,A,1>
JOSS 150,<LC,A,8,1>
JOSS 151,<LC,B,4,2>
JOSS 152,<LC,C,B,A>
JOSS 153,<LC,A,4,2>
JOSS 154,<LC,C,A,8>
JOSS 155,<LC,C,B,1>
JOSS 156,<LC,C,A,2>
JOSS 157,<LC,C,B,8>
JOSS 160,<LC,B,A,4>
JOSS 161,<LC,C,B,A,4,2>
JOSS 162,<LC,B,4,1>
JOSS 163,<LC,B,8,1>
JOSS 164,<LC,A>
JOSS 165,<LC,A,2,1>
JOSS 166,<LC,B,2,1>
JOSS 167,<LC,C,B,8,2,1>
JOSS 170,<LC,C,A,1>
JOSS 171,<LC,C,B,A,8,1>
JOSS 172,<LC,C,8,2>
JOSS 173,<UC,B,A,4,2,1>
JOSS 174,<UC,B>
JOSS 175,<UC,C,B,2>
JOSS 176,<LC,B>
JOSS 177,<B,8,4,2,1>
CIRCLC=374
CIRCLD=264
SHFTLC=237
SHFTUC=234
BKSPC=335
IDLEC=275
BALL2: ;#137M
EXP J000,J001,J002,J003,J004,J005,J006,J007 ;000-007
EXP J010,J011,J012,J013,J014,J015,J016,J017 ;010-017
EXP J020,J021,J022,J023,J024,J025,J026,J027 ;020-027
EXP J030,J031,J032,J033,J034,J035,J036,J037 ;030-037
EXP J040,J041,J042,J043,J045,J074,J046,J047 ;040-047
EXP J051,J132,J112,J152,J142,J176,J055,J170 ;050-057
EXP J172,J061,J062,J063,J065,J067,J066,J070 ;060-067
EXP J064,J060,J127,J167,J076,J071,J044,J130 ;070-077
EXP J050,J107,J052,J106,J120,J072,J121,J133 ;100-107
EXP J077,J131,J115,J135,J126,J100,J122,J111 ;110-117
EXP J101,J117,J123,J116,J125,J105,J104,J113 ;120-127
EXP J103,J114,J110,J102,J124,J137,J124,J134 ;130-137
EXP J140,J147,J053,J146,J160,J073,J161,J054 ;140-147
EXP J057,J171,J155,J056,J166,J075,J162,J151 ;150-157
EXP J141,J157,J163,J156,J165,J145,J144,J153 ;160-167
EXP J143,J154,J150,J102,J124,J137,J164,J177 ;170-177
BALL3: ;#938
EXP J000,J001,J002,J003,J004,J005,J006,J007 ;000-007
EXP J010,J011,J012,J013,J014,J015,J016,J017 ;010-017
EXP J020,J021,J022,J023,J024,J025,J026,J027 ;020-027
EXP J030,J031,J032,J033,J034,J035,J036,J037 ;030-037
EXP J040,J127,J076,J071,J167,J074,J152,J046 ;040-047
EXP J051,J132,J044,J112,J142&377,J176,J055&377,J170 ;050-057
EXP J172,J061,J062,J063,J065,J067,J066,J070 ;060-067
EXP J064,J060,J045,J043,J124,J047,J042,J130 ;070-077
EXP J164,J107,J052,J106,J120,J072,J121,J133 ;100-107
EXP J077,J131,J115,J135,J126,J100,J122,J111 ;110-117
EXP J101,J117,J123,J116,J125,J105,J104,J113 ;120-127
EXP J103,J114,J110,J102,J050,J137,J050,J134 ;130-137
EXP J140,J147,J053,J146,J160,J073,J161,J054 ;140-147
EXP J057,J171,J155,J056,J166,J075,J162,J151 ;150-157
EXP J141,J157,J163,J156,J165,J145,J144,J153 ;160-167
EXP J143,J154,J150,J102,J050,J137,J164,J177 ;170-177
BALL4: ;#015
EXP J000,J001,J002,J003,J004,J005,J006,J007 ;000-007
EXP J010,J011,J012,J013,J014,J015,J016,J017 ;010-017
EXP J020,J021,J022,J023,J024,J025,J026,J027 ;020-027
EXP J030,J031,J032,J033,J034,J035,J036,J037 ;030-037
EXP J040,J176,J100,J043,J044,J045,J074,J075 ;040-047
EXP J050,J051,J076,J052,J054&377,J055,J056&377,J057 ;050-057
EXP J060,J154,J062,J063,J064,J065,J066,J067 ;060-067
EXP J070,J071,J072,J073,J050,J053,J051,J077 ;070-077
EXP J042,J101,J102,J103,J104,J105,J106,J107 ;100-107
EXP J110,J111,J112,J113,J114,J115,J116,J117 ;110-117
EXP J120,J121,J122,J123,J124,J125,J126,J127 ;120-127
EXP J130,J131,J132,J047,J176,J061,J176,J137 ;130-137
EXP J075,J141,J142,J143,J144,J145,J146,J147 ;140-147
EXP J150,J151,J152,J153,J154,J155,J156,J157 ;150-157
EXP J160,J161,J162,J163,J164,J165,J166,J167 ;160-167
EXP J170,J171,J172,J047,J176,J061,J075,J177 ;170-177
DEFINE CMD(NAME,ABRV,MODE) <
XLIST
L1=.
SIXBIT "NAME"
L2=.
IF2,<IFNDEF ABRV'COM,<ABRV'COM=NULCOM>>
REPEAT <4-L2+L1>,< 0>
SIXBIT "ABRV"
LIST
XWD MODE,ABRV'COM>
; TABLE OF TEXT COMMANDS TO RUNOFF
COMTAB:
CMD ADJUST,AJ,BREAKM!JUSTM
CMD BEGINPAGE,BP,BREAKM!NPAGEM
CMD BLANK,BK
CMD BOTTOMLINE,BL,BREAKM!SPACEM
CMD BOTTOMMARGIN,BMR
CMD BREAK,B,BREAKM
CMD CAPITALIZESENTENCES,CS,CAPSM
CMD CENTER,C,BREAKM!CENTRL
CMD CENTERLINE,CL,BREAKM
CMD CLEARTABS,CT
CMD DOUBLESPACE,DS,DSPCM
CMD ENDFIGURE,EFIG,BREAKM!NPAGEM
CMD FIGURE,FIG,BREAKM
CMD FILL,F,FILLM
CMD HEADER,H,BREAKM!HEADL!HEADM
CMD INDENT,I,BREAKM!DENTM
CMD INDENTMARGIN,IM,BREAKM
CMD JUSTIFY,J,BREAKM!JUSTM
CMD LEFTMARGIN,LMR,BREAKM
CMD LINE,L,BREAKM!SPACEM
CMD LINELENGTH,LNL,BREAKM
CMD LOWERCASE,LC,LOWCM
CMD NOCAPITALIZESENTENCES,NCS
CMD NOFILL,NF,BREAKM
CMD NOJUST,NJ,BREAKM
CMD NOLOWERCASE,NLC
CMD NONUMBERPAGES,NNP
CMD NOPAGEPREFIX,NPP
CMD NUMBERPAGESBOTTOM,NPB,PNBOT
CMD NUMBERPAGESTOP,NPT,PNTOP
CMD PAGEPREFIX,PP
CMD PAPERLENGTH,PRL,BREAKM
CMD SETTABS,ST
CMD SINGLESPACE,SS
CMD SPACE,SP,BREAKM!SPACEM
CMD TAB,T
CMD TOPMARGIN,TMR
CMD UNDENT,UD,BREAKM!DENTM
CMD UNDENTMARGIN,UM,BREAKM
CMD UNDERLINE,UL,ULINEM
CMD UPPERCASE,UC,UCM
COMTBL=.-COMTAB
; BREAK OFF PREVIOUS LINE
BRKCOM: PUSH P,S ;SAVE STATUS
TLZ S,JUSTM ;DO NOT RIGHT ADJUST PARTIAL LINE
SKIPE SYMCNT ;SKIP IF NO SYMBOLS TO OUTPUT
PUSHJ P,OUTLIN ;OUTPUT PARTIAL LINE
SETZM SYMCNT ;RESET SYMBOL COUNT
SETZM ALNGTH ;RESET ACCUMULATED LENGTH
POP P,T1 ;RESTORE STATUS
TLNE T1,JUSTM
TLO S,JUSTM
NULCOM: POPJ P, ;EXIT
; SET BOTTOM MARGIN
BMRCOM: MOVE T1,PAPERL ;T1 = PAPER LENGTH
SUB T1,NUMARG ;T1 = PAGE LENGTH - NEW BOTTOM MARGIN
CAMG T1,TOPMRG ;IT SHOULD BE GREATER THAN TOP MARGIN
POPJ P, ;IT ISN'T, IGNORE COMMAND
MOVEM T1,BOTLIN ;IT WAS, STORE NEW BOTTOM LINE
MOVE T1,NUMARG
MOVEM T1,BOTMRG ;STORE NEW BOTTOM MARGIN
POPJ P, ;EXIT
; INDENT SPECIFIED NUMBER OF SPACES FROM LEFT MARGIN
ICOM: SKIPE T1,DENT ;ARE WE ALREADY INDENTED?
ADDM T1,LINEL ;YES. ADJUST LINE LENGTH
MOVE T1,NUMARG ;T1 = INDENTATION AMOUNT
CAML T1,LINEL ;IT MUST BE LESS THAN LINE LENGTH
JRST UDCOM2 ;IT ISN'T, JUMP
MOVEM T1,DENT ;IT IS, STORE IT
JRST UDCOM1 ;ADJUST LINE LENGTH AND EXIT
; SET LEFT MARGIN SPACING
LMRCOM: MOVE T1,NUMARG ;T1 = NEW LEFT MARGIN SETTING
EXCH T1,LFTMRG ;STORE IT
SUB T1,LFTMRG
ADDM T1,LINEL ;ADJUST LINE LENGTH
POPJ P, ;EXIT
; SET LINE LENGTH
LNLCOM: MOVE T1,NUMARG ;T1 = NEW LINE LENGTH
CAIG T1,MAXLL ;IS IT LARGER THAN MAXIMUM LINE LENGTH?
MOVEM T1,LINEL ;NO. STORE IT
POPJ P, ;EXIT
; DO NOT CAPITALIZE SENTENCES
NCSCOM: TLZ S,CAPSM ;RESET CAPITALIZE SENTENCES MODE
POPJ P, ;EXIT
; SET PAPER LENGTH
PRLCOM: MOVE T1,NUMARG ;T1 = NEW PAPER LENGTH
SUB T1,BOTMRG ;T1 = PAPER LENGTH - BOTTOM MARGIN
CAMG T1,TOPMRG ;IS IT GREATER THAN TOP MARGIN?
POPJ P, ;NO. TOO SMALL, IGNORE IT
MOVEM T1,BOTLIN ;STORE BOTTOM LINE
MOVE T1,NUMARG
MOVEM T1,PAPERL ;STORE PAPER LENGTH
POPJ P, ;EXIT
; SPACE SPECIFIED NUMBER OF LINES BEFORE NEXT LINE
SPCOM: MOVE T1,NUMARG ;STORE LINE SPACING COUNT
SKIPN T1
MOVEI T1,1 ;SET SPACING TO 1 IF NOT SPECIFIED
MOVEM T1,SPCNT
JRST OUTLIN ;OUTPUT SPACING AND EXIT
; SET TOP MARGIN
TMRCOM: MOVE T1,NUMARG ;T1 = NEW TOP MARGIN
CAMGE T1,BOTLIN ;IT SHOULD BE LESS THAN BOTTOM LINE
MOVEM T1,TOPMRG ;IT IS, STORE IT
POPJ P, ;EXIT
; DO NOT FILL LINES
NFCOM: TLZ S,FILLM!JUSTM ;RESET FILL MODE AND JUSTIFY MODE
POPJ P, ;EXIT
; DO NOT RIGHT JUSTIFY LINES
NJCOM: TLZ S,JUSTM ;RESET JUSTIFY MODE
POPJ P, ;EXIT
; RESET LOWER CASE MODE
NLCCOM: TLZ S,LOWCM ;RESET LOWER CASE MODE
POPJ P, ;EXIT
; DO NOT NUMBER PAGES
NNPCOM: TLZ S,PNTOP!PNBOT ;RESET NUMBER PAGES AND/OR TOP MODES
POPJ P, ;EXIT
; NUMBER PAGES AT TOP AND/OR BOTTOM
NPBCOM:
NPTCOM: SKIPE T1,NUMARG ;WAS NON-ZERO ARGUMENT SPECIFIED?
MOVEM T1,PAGENO ;YES. SET PAGENO TO IT
POPJ P, ;EXIT
; UNDENT SPECIFIED NUMBER OF SPACES FROM LEFT MARGIN
UDCOM: SKIPE T1,DENT ;ARE WE ALREADY INDENTED?
ADDM T1,LINEL ;YES. ADJUST LINE LENGTH
MOVE T1,NUMARG ;T1 = UNDENTATION
CAMLE T1,LFTMRG ;IS IT GREATER THAN THE LEFT MARGIN?
JRST UDCOM2 ;YES. JUMP
MOVNM T1,DENT ;NO. STORE IT
MOVNS T1
UDCOM1: SUB T1,LINEL ;ADJUST LINE LENGTH
MOVNM T1,LINEL
POPJ P, ;EXIT
UDCOM2: TLZ S,DENTM ;RESET INDENT MODE
POPJ P, ;EXIT
; CENTER NEXT LINE OF OUTPUT
CLCOM: TRO S,CENTOL ;SET MODE BIT
POPJ P, ;EXIT
; SET SINGLE SPACING (I.E. RESET DOUBLE SPACING MODE)
SSCOM: TLZ S,DSPCM ;RESET DOUBLE SPACING MODE
POPJ P, ;EXIT
; ADD PAGE PREFIX (THE FOLLOWING LINE) TO ALL PAGE NUMBERS
PPCOM: TROA S,PPM!PPL ;SET PAGE PREFIX MODES
; RESET PAGE PREFIXING MODES
NPPCOM: TRZ S,PPM!PPL ;RESET PAGE PREFIXING MODES
POPJ P, ;EXIT
; INDENT LEFT MARGIN
IMCOM: SKIPA T1,NUMARG ;T1 = INDENTATION
; UNDENT LEFT MARGIN
UMCOM: MOVN T1,NUMARG ;T1 = - INDENTATION
ADD T1,LFTMRG ;T1 = NEW LEFT MARGIN
JRST LMRCOM+1 ;PROCESS REST OF COMMAND
; SKIP TO BOTTOM LINE OF PAGE
BLCOM: SKIPA T1,BOTLIN ;T1 = DESIRED LINE
; SKIP TO SPECIFIED LINE NUMBER
LCOM: MOVE T1,NUMARG ;T1 = DESIRED LINE
SUBI T1,1 ;ADJUST PARAMETER
CAMLE T1,LINENO ;IS IT .LE. CURRENT LINE?
CAMLE T1,BOTLIN ;NO. IS IT TOO LARGE?
POPJ P, ;YES. EXIT
SUB T1,LINENO ;NO. COMPUTE NECESSARY SPACING
MOVEM T1,SPCNT ;STORE SPACING COUNT
JRST OUTLIN ;PROCESS SPACING
; PROCESS FIGURE PAGE
FIGCOM: SKIPN T1,LINENO ;ARE WE AT TOP OF PAGE?
POPJ P, ;YES. EXIT
MOVEM S,SSV ;SAVE STATE
TRO S,FIGM ;SET PROCESSING FIGURE MODE
TRZ S,OFIGSW
MOVEM T1,LINESV ;NO. SAVE LINE NUMBER
MOVE T1,PAGENO ;SAVE PAGE NUMBER
MOVEM T1,PAGESV
MOVE T1,SPCNT
MOVEM T1,SPCNSV ;SAVE SPACING COUNT
SETZM LINENO
SETZM SPCNT
AOS T1,FIGCNT ;INCREMENT FIGURE COUNT
ADD T1,PAGENO
ADDI T1,1 ;T1 = PAGE NUMBER FOR FIGURE
MOVEM T1,PAGENO ;STORE IT
SKIPE FIGCNT
POPJ P, ;EXIT IF MORE THAN 1 FIGURE
HRRZ T1,JOBREL ;COMPUTE AVAILABLE SPACE COUNT
SUB T1,JOBFF
IMULI T1,5
ADDI T1,4
MOVEM T1,FSCNT
MOVE T1,JOBFF
HRLI T1,<POINT 7,0>/1B17
MOVEM T1,FSIPNT ;INITIALIZE POINTERS
MOVEM T1,FSPNT
POPJ P, ;EXIT
; TERMINATE FIGURE PROCESSING
EFIGCO: PUSHJ P,OUTLIN ;SKIP TO NEW PAGE
TRNN S,FIGM ;ARE WE PROCESSING A FIGURE?
POPJ P, ;NO. EXIT
PUSH P,C ;SAVE C
SETZ C,
OUTC ;STORE TERMINATING NULL
POP P,C ;RESTORE C
MOVE T1,PAGENO
EXCH T1,PAGESV
MOVEM T1,PAGENO ;RESTORE PAGE NUMBER
MOVE T1,LINESV
MOVEM T1,LINENO ;RESTORE LINE NUMBER
MOVE T1,SPCNSV
MOVEM T1,SPCNT ;RESTORE SPACING COUNT
MOVE S,SSV ;RESTORE STATE
TRO S,OFIGSW ;SET OUTPUT THE FIGURE SWITCH
POPJ P, ;EXIT
; SET TABS
STCOM: JUMPE A5,STCOM3 ;JUMP IF NO ARGUMENT
STCOM1: CAILE A5,MAXLL ;IS TAB SETTING IN RANGE?
JRST STCOM2 ;NO. IGNORE IT
SETOM TABTBL(A5) ;YES. SET TAB
STCOM2: PUSHJ P,GETARG ;GET NEXT TAB SETTING
JRST STCOM1 ;PROCESS IT
POPJ P, ;NONE LEFT, EXIT
STCOM3: SETZ A5, ;CLEAR TABLE INDEX
MOVEI A4,1 ;INITIALIZE TAB INDEX
STCOM4: SETZM TABTBL(A5) ;CLEAR TAB
CAME A5,A4
JRST STCOM5
SETOM TABTBL(A5) ;SET TABS AT 8N+1
ADDI A4,↑D8
STCOM5: CAIE A5,MAXLL-1 ;ARE WE FINISHED?
AOJA A5,STCOM4 ;NO. CONTINUE
POPJ P, ;YES. EXIT
; CLEAR TABS
CTCOM: JUMPE A5,CTCOM3 ;JUMP IF NO ARGUMENT
CTCOM1: CAILE A5,MAXLL ;IS TAB SETTING IN RANGE?
JRST CTCOM2 ;NO. IGNORE IT
SETZM TABTBL(A5) ;YES. CLEAR IT
CTCOM2: PUSHJ P,GETARG ;GET NEXT TAB TO BE CLEARED
JRST CTCOM1 ;PROCESS IT
POPJ P, ;NONE LEFT, EXIT
CTCOM3: MOVEI A5,MAXLL-1 ;CLEAR TABS AT EACH POSITION
SETZM TABTBL(A5)
SOJGE A5,.-1
POPJ P, ;EXIT
GETARG: SETZ A5, ;CLEAR ARGUMENT VALUE
JNE 54,GETAR2 ;IF NOT COMMA, EXIT
GETAR1: GETC
JNN GETAR3 ;IF NOT NUMERIC, EXIT
IMULI A5,↑D10
ADDI A5,-"0"(C) ;ACCUMULATE DIGIT
JRST GETAR1 ;CONTINUE
GETAR2: AOS (P) ;END OF ARGUMENTS, RETURN
GETAR3: POPJ P, ;EXIT
; TAB TO NEXT TAB SETTING OR TO SPECIFIED POSITION
TCOM: TLNE S,FILLM ;NOFILL MODE?
TLNE S,JUSTM ;NO. JUSTIFYING?
POPJ P, ;YES. IGNORE COMMAND
SOJLE A5,TCOM1 ;JUMP IF ARGUMENT NOT SPECIFIED
CAMG A5,ALNGTH ;ARE WE AT OR PAST DESIRED POSITION?
POPJ P, ;YES. IGNORE COMMAND
SUB A5,ALNGTH ;NO. A5 = DESIRED SPACING
JRST TCOM3
TCOM1: MOVE A4,ALNGTH ;NO ARGUMENT, COUNT SPACES TO NEXT TAB
MOVEI A5,1
TCOM2: ADDI A4,1
CAMGE A4,LINEL
SKIPE TABTBL+1(A4)
JRST .+2
AOJA A5,TCOM2
TCOM3: AOS T1,SYMCNT ;CREATE SYMBOL WITH (A5)-1 SPACES
ADDM A5,ALNGTH ;INCREMENT ACCUMULATED LENGTH
LDB A1,[POINT 9,SYMPNT-2(T1),26]
ADDI A1,4
IDIVI A1,5
HLRZ SP,SYMPNT-2(T1)
ADD SP,A1
HRLZM SP,SYMPNT-1(T1)
SOJLE A5,TCOM4
HRLI SP,(POINT 7,0)
PUSH P,C
MOVEI C," "
TLO SS,DONTUL ;SET DON'T UNDERLINE SWITCH
PUSHJ P,STOREC
SOJG A5,.-1
TLZ SS,DONTUL ;RESET DON'T UNDERLINE SWITCH
POP P,C
TCOM4: POPJ P, ;EXIT
; INSERT BLANKS
BKCOM: TLNE S,FILLM ;NOFILL MODE?
TLNE S,JUSTM ;NO. JUSTIFYING?
POPJ P, ;YES. IGNORE COMMAND
SOJG A5,TCOM3 ;IF MORE THAN 1 BLANK, JUMP
POPJ P, ;OTHERWISE, EXIT
; BEGIN PAGE COMMAND
;
; IF ARGUMENT IS NON-ZERO, A NEW PAGE IS BEGUN IF THE
; NUMBER OF REMAINING LINES ON THE PAGE IS
; LESS THAN THE SPECIFIED ARGUMENT
BPCOM: SKIPG T1,NUMARG ;SKIP IF AN ARGUMENT
JRST OUTLIN ;ELSE BEGIN A PAGE
ADD T1,LINENO ;T1 = CURRENT LINE + N
TLZ S,NPAGEM ;RESET NEW PAGE MODE
CAMG T1,BOTLIN ;IF (T1) > BOTLIN BEGIN PAGE
POPJ P, ;OTHERWISE EXIT
TLO S,NPAGEM ;SET NEW PAGE MODE
JRST OUTLIN ;SKIP TO A NEW PAGE
; CHARACTER CLASS TABLE
;
; FIELD #1 [0,0]: 1 IF ALPHABETIC
; 0 IF NOT ALPHABETIC
;
; FIELD #2 [1,1]: 1 IF NUMERIC
; 0 IF NOT NUMERIC
;
; FIELD #3 [2,2]: 1 FILL MODE CHARACTER
; 0 NULL CHARACTER IN FILL MODE
;
; FIELD #4 [3,3]: 1 NOFILL MODE CHARACTER
; 0 NULL CHARACTER IN NOFILL MODE
;
; FIELD #5 [4,4]: 1 FILL MODE CONTROL CHARACTER
; 0 NOT FILL MODE CONTROL CHARACTER
;
; FIELD #6 [5,5]: 1 IF CHARACTER PRINTS ON TTY33
; 0 IF CHARACTER NON-PRINTING ON TTY33
;
; FIELD #7 [6,12]: CHARACTER TO BE OUTPUT IN PLACE
; OF THIS NON-PRINTING (ON TTY33) CHARACTER
;
; FIELD #8 [13,14]: 0 IF CHARACTER LENGTH = -1
; 1 IF CHARACTER LENGTH = 0
; 2 IF CHARACTER LENGTH = 1
;
; FIELD #9 [15,15]: 1 NOFILL MODE CONTROL CHARACTER
; 0 NOT NOFILL MODE CONTROL CHARACTER
;
; FIELD #10 [16,16]: 1 HIDDEN CHARACTER ON LP10E
; 0 NOT A HIDDEN CHARACTER ON LP10E
;
; FIELD #11 [17,17]: 1 CHARACTER IS AN END OF SENTENCE INDICATOR
; 0 CHARACTER NOT AN ESI INDICATOR
; CHARACTER CLASS DEFINITIONS
CA=1B18
CN=1B19
CF=1B20
CNF=1B21
CFC=1B22
CTTY33=1B23
CNFC=1B33
CLPEH=1B34
CEST=1B35
DEFINE BY(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11),<
LIST
BYTE (1) X1,X2,X3,X4,X5,X6 (7) X7 (2) X8 (1) X9,X10,X11 (18) 0>
DEFINE C <
XLIST
IF1,<BLOCK 1>
IF2,<
I=.-CLASS
F1=0
F2=0
F3=0
F4=0
F5=0
F6=0
F7=0
F8=2
F9=0
F10=0
F11=0
IFGE I-"A",<IFLE I-"Z",<F1=1>>
IFGE I-"A"-40,<IFLE I-"Z"-40,<F1=1
F7=I>>
IFLE I-37,<F8=1>
IFE I-177,<F8=1>
IFGE I-"0",<IFLE I-"9",<F2=1>>
IFE I-10,<F3=1
F4=1
F8=0>
IFGE I-41,<IFLE I-176,<F3=1
F4=1>>
IFE I-15,<F5=1
F9=1>
IFE I-" ",<F5=1
F4=1
F11=1>
IFE I-".",<F5=1
F9=1
F11=1>
IFE I-"↑",<F5=1
F9=1>
IFE I-"?",<F5=1
F11=1>
IFE I-"!",<F5=1
F11=1>
IFE I-11,<F6=1
F9=1
F5=1
F4=1>
IFGE I-" ",<IFLE I-"←",<F6=1>>
IFE I-177,<F10=1>
IFE I,<F10=1>
IFGE I-11,<IFLE I-15,<F10=1>>
IFGE I-20,<IFLE I-24,<F10=1>>
IFE I-",",<F11=1>
IFE I-")",<F11=1>
IFE I-"""",<F11=1>
IFE I-073,<F11=1>
IFE I-":",<F11=1>
BY \F1,\F2,\F3,\F4,\F5,\F6,\F7,\F8,\F9,\F10,\F11
>>
CLASS:
; ASCII 000-017
REPEAT 20,<C>
; ASCII 020-037
REPEAT 20,<C>
; ASCII 040-057
REPEAT 20,<C>
; ASCII 060-077
REPEAT 20,<C>
; ASCII 100-117
REPEAT 20,<C>
; ASCII 120-137
REPEAT 20,<C>
; ASCII 140-157
REPEAT 20,<C>
; ASCII 160-177
REPEAT 20,<C>
SPECER: MOVEI PNT,[ASCIZ /Error in specification!/]
JRST ERRTYP
LPTTST: TLNN A1,40000 ;IS OUTPUT TO LPT?
JRST OPNERR ;NO.
TYPE [ASCIZ /LPT is busy. I'll wait for it. Type ahead./]
TYPE CRLF
MOVEI T1,1 ;SLEEP FOR 1 SECOND
CALLI T1,SLEEP
OPEN OUT,OPENO ;TRY OPENING OUTPUT AGAIN
JRST .-3 ;STILL BUSY, SLEEP SOME MORE
JRST OPN3A ;OKAY, CONTINUE PROCESSING
OPNERR: MOVEI PNT,[ASCIZ /I can't open the channel!/]
JRST ERRTYP
LKERR: MOVEI PNT,[ASCIZ /I can't find the input file!/]
JRST ERRTYP
ENTERR: MOVEI PNT,[ASCIZ /I can't write the output file!/]
ERRTYP: HRLI PNT,<POINT 7,0>/1B17
PUSHJ P,TYPEIT
TYPE CRLF
SETZM TTYI+2 ;CLEAR INPUT BUFFER
JRST RUNOFF
COMER0: POP P,T1
COMER: POP P,T1
TYPE [ASCIZ /Command error!/]
TYPE CRLF
SETZM TTYI+2 ;CLEAR INPUT BUFFER
JRST RUN4
; INITIAL STATE VECTOR:
ISTATE: XWD STOPM!JUSTM!FILLM!SOSM,0
CRLF: BYTE (7) 15,12 ;CR LF
BELL: BYTE (7) 7 ;ASCII CODE TO RING BELL ON TTY
PSYML: POINT 9,SYMPNT-1(T2),35
PSYMC: POINT 9,SYMPNT-1(T2),26
RMULT: EXP 5*5*5*5*5*5*5*5*5*5*5*5*5*5*5
LIT
; DATA AREA (IMPURE DATA AREA)
DATA: ;START OF CONSTANT DATA AREA
PHASE 140
TTYIO: 1
SIXBIT /TTY/
XWD TTYO,TTYI
OPENI: 1 ;INPUT OPEN SPECIFICATION BUFFER
SIXBIT /DSK/
XWD 0,INBUF
OPENO: 1 ;OUTPUT OPEN SPECIFICATION BUFFER
SIXBIT /TTY/
XWD OUTBUF,0
OPNT: OUT OUT,
EXP OUTBUF+1
EXP OUTBUF+2
IPNT: IN IN,
EXP INBUF+1
EXP INBUF+2
STATZ IN,740000
P2741: XWD C,BALL1 ;BALL #1 ASSUMED INITIALLY
VAR
DATAE=.-1 ;END OF INITIALIZED CONSTANT DATA AREA
LC=.
DEPHASE
RELOC LC-140
B DATBEG,0 ;START OF AREA WHICH IS CLEARED AT EACH START
B PS,PSL ;PUSH-DOWN STACK
B LB,4 ;LOOKUP BUFFER
B EB,4 ;ENTER BUFFER
B TTYI,3 ;TTY INPUT BUFFER HEADER
B TTYO,3 ;TTY OUTPUT BUFFER HEADER
B INBUF,3 ;INPUT BUFFER RING HEADER
B OUTBUF,3 ;OUTPUT BUFFER RING HEADER
B RANDOM,1 ;STORAGE WORD FOR RANDOM NUMBERS
B SKPCNT,1 ;PAGE SKIP COUNTER
B LFTMRG,1 ;LEFT MARGIN SETTING
B PGBIAS,1 ;PAGE MARGIN BIAS
B TOPMRG,1 ;TOP MARGIN SETTING
B BOTMRG,1 ;BOTTOM MARGIN SETTING
B BOTLIN,1 ;LINE # OF BOTTOM LINE
B LINEL,1 ;LINE LENGTH
B PAPERL,1 ;PAPER LENGTH
B LINENO,1 ;CURRENT LINE #
B PAGENO,1 ;CURRENT PAGE #
B NUMARG,1 ;NUMERIC ARGUMENT OF COMMAND
B DENT,1 ;INDENTATION (UNDENTATION) FROM LEFT MARGIN
B SPCNT,1 ;LINE COUNT TO BE SPACED BEFORE NEXT LINE
B LFCHR,1 ;LINE FEED CHARACTER FOR OUTPUT
B FSCNT,1 ;AVAILABLE SPACE COUNTER
B FSIPNT,1 ;INITIAL POINTER TO AVAILABLE SPACE
B FSPNT,1 ;POINTER FOR FIGURE BUFFER
B PAGESV,1 ;SAVED PAGE NUMBER
B LINESV,1 ;SAVED LINE NUMBER
B SPCNSV,1 ;SAVED SPACING COUNT
B FIGCNT,1 ;FIGURE COUNTER
B SSV,1 ;STATE SAVED HERE
B CRCNT,1 ;CARRIAGE RETURN COUNTER
B SLWCNT,1 ;SLOW OUTPUT COUNTER
B HPOS,1 ;HORIZONTAL POSITION
B SPCTR,1 ;SPACE COUNTER
B ILL,1 ;INITIAL LINE LENGTH
B DLYSCT,1 ;DELAYED SPACES COUNT
B CSAVE,1 ;C SAVED HERE
; FORMAT OF SYMBOL POINTER WORD IN SYMBOL POINTER TABLE:
;
; BYTE (18) SYMBOL ADDRESS (9) CHARACTER COUNT (9) SYMBOL LENGTH
B SYMCNT,1 ;SYMBOL COUNTER
B SYMPN1,1 ;THIS MUST PRECEDE SYMPNT
B SYMPNT,MAXLL/2 ;SYMBOL POINTER TABLE
B TABTBL,MAXLL ;TAB TABLE
B SYMTAB,3*MAXLL/2 ;SYMBOL STORAGE TABLE
B ALNGTH,1 ;ACCUMULATED LINE LENGTH
B HEADBF,3*<MAXLL+5>/5 ;HEADING BUFFER
B PPWRD,1 ;PAGE PREFIX CONTROL WORD
B PPBUF,3*<MAXLL+5>/5 ;PAGE PREFIX BUFFER
B ENDRUN,0
END RUNOFF